Em fevereiro, escrevi um post no blog sobre correção automática de plano no SQL Server e, neste post, quero falar sobre o gerenciamento automático de índice, o segundo componente do recurso de ajuste automático. O Gerenciamento Automático de Índice está disponível apenas no Banco de Dados SQL do Azure e não está no roteiro para estar disponível na próxima versão do SQL Server local. Essa opção é habilitada independentemente da Correção Automática de Plano e, como o nome indica, ela gerenciará os índices em seu banco de dados. Especificamente, ele pode criar índices que estão faltando e pode remover índices que não são usados e aqueles que são duplicados. Vejamos como isso ocorre.
Sob as Coberturas
O Gerenciamento Automático de Índices depende de dados para tomar sua decisão. Para a criação de índice potencial, ele usa informações do DMV de índice ausente e o rastreia ao longo do tempo e combina esses dados com um modelo interno para determinar o benefício do índice. Ele também usa o Repositório de Consultas para determinar se o índice oferece benefício, portanto, deve ser habilitado para o banco de dados, assim como com a Correção Automática de Plano. Com relação à eliminação de índices, são usados dados do DMV de uso de índice (sys.dm_db_index_usage_stats), bem como metadados de índice (por exemplo, número de colunas, tipos de dados de coluna).
Ativando o Gerenciamento Automático de Índice
Como mencionado, o Query Store deve estar habilitado para o banco de dados. Isso pode ser feito no SSMS, com T-SQL e com a API REST para o Banco de Dados SQL do Azure. Observe que o Repositório de Consultas está habilitado por padrão para bancos de dados no Azure e está desde o quarto trimestre de 2016.
USE [master]; GO ALTER DATABASE [WideWorldImporters] SET QUERY_STORE = ON; GO ALTER DATABASE [WideWorldImporters] SET QUERY_STORE (OPERATION_MODE = READ_WRITE); GO
Depois que o Repositório de Consultas estiver habilitado, você poderá usar o Portal do Azure, T-SQL ou API EST para habilitar o Gerenciamento Automático de Índice no Banco de Dados SQL do Azure (C# e PowerShell estão em andamento).
ALTER DATABASE [WWI_PS] SET AUTOMATIC_TUNING (CREATE_INDEX = ON, DROP_INDEX = ON); GO
O Gerenciamento Automático de Índice será habilitado por padrão para novos bancos de dados no Azure (https://azure.microsoft.com/en-us/blog/automatic-tuning-will-be-a-new-default/) em um futuro próximo. A partir de janeiro de 2018, a Microsoft iniciou o lançamento para habilitar o Ajuste Automático para Bancos de Dados SQL do Azure que ainda não o tinham habilitado, com notificações enviadas aos administradores para que a opção possa ser desabilitada, se desejado. Esse processo leva vários meses, então se você ainda não recebeu uma notificação, não entre em pânico!
Como funciona
Para a criação do índice, há, atualmente, uma janela contínua de sete (7) dias* durante a qual os dados são rastreados e, no mínimo, o modelo precisa de nove (9) horas* de dados para recomendar um índice, juntamente com com 12 horas* de dados no Repositório de Consultas que serão usados como linha de base. Se for determinado que um índice fornecerá benefícios significativos, o SQL Server criará o índice.
*Esses valores podem mudar no futuro, à medida que o modelo se desenvolve.
Nota:no momento, o modelo mescla recomendações. Ou seja, se vários índices forem recomendados para uma tabela, mas um índice puder ser criado para cobrir todas as opções, ele poderá criar esse índice atualmente. No entanto, o modelo não é inteligente o suficiente para mesclar um índice recomendado com um já existente.
Depois que um índice é criado, o SQL Server verifica se ele oferece benefícios usando o Query Store (portanto, deve ser habilitado para o banco de dados). Ele monitora o desempenho de qualquer consulta que usa o novo índice e compara a CPU da consulta antes de o índice ser adicionado e ao usar o índice. Se houver uma regressão no desempenho da consulta como resultado do índice, ele reverterá (descartará) o índice. O SQL Server monitora o desempenho da consulta por até três (3) dias ou até que 100% da carga de trabalho relevante tenha sido analisada. Após esse período, se o índice não mostrar nenhum sinal de regressão, ele não revisará o desempenho novamente.
Entenda que se o Gerenciamento Automático de Índice criar um índice e, dois meses depois, sua carga de trabalho for alterada e se beneficiar desse mesmo índice criado automaticamente anteriormente, mas com uma coluna adicional, o SQL Server criará, no momento, um novo índice. Atualmente, não há lógica para alterar um índice existente criado automaticamente, mas essa funcionalidade está no roteiro do recurso.
Com relação à eliminação de índices, se um índice não tiver buscas ou varreduras por 90 dias, mas tiver um custo de manutenção (o que significa que há inserções, atualizações ou exclusões), ele será descartado. Índices duplicados também serão removidos, supondo que sejam uma duplicata exata (e o esquema é usado para determinar se os índices são exatamente os mesmos). Se houver índices duplicados em termos de colunas de chave e colunas incluídas (se relevante), mas um ou mais deles tiver um filtro, eles não serão realmente duplicados e nenhum índice será descartado.
Para referência, há duas vezes mais recomendações de DROP INDEX no Banco de Dados SQL do Azure do que recomendações de CREATE INDEX.
Quando você habilita a opção DROP INDEX, o SQL Server descarta os índices criados pelo usuário. Quando você habilita a opção CREATE INDEX, o SQL Server tem a capacidade de criar índices automaticamente e também pode descartar esses índices (mas não descartará índices criados pelo usuário). Por fim, os índices são criados e descartados durante períodos de carga de trabalho fora do pico, conforme determinado pela DTU. Se a carga de trabalho estiver acima de 80% de DTU, o SQL Server aguardará para criar ou descartar o índice até que a carga do sistema diminua.
Eu realmente vou deixar o SQL Server ter controle?
Talvez. Minha recomendação sobre esse recurso, inicialmente, requer uma abordagem “confiar, mas verificar”.
Assim como a Correção Automática de Plano, o Gerenciamento Automático de Índice foi desenvolvido com uma quantidade substancial de dados capturados de quase dois milhões de Bancos de Dados SQL do Azure. O recurso Automatic Index Management está disponível no Banco de Dados SQL do Azure desde o primeiro trimestre de 2016, como parte do Index Advisor.
Os algoritmos usados pelo recurso evoluíram e continuam evoluindo ao longo do tempo, à medida que mais bancos de dados o utilizam e mais dados são capturados e analisados. No entanto, existem algumas limitações atualmente.
- As recomendações de índice não são avaliadas em relação aos índices existentes, portanto, a consolidação de índices entre índices novos e existentes não está disponível no momento.
- Se um índice fornecer benefícios para um SELECT, a sobrecarga de modificações devido a INSERTs, UPDATEs e DELETEs não é conhecida antes da criação. O SQL Server monitora essa sobrecarga durante o processo de verificação, após a implementação do índice.
Há benefícios no Gerenciamento Automático de Índices que vale a pena mencionar:
- Para quem precisa gerenciar um banco de dados SQL Server, mas não é um DBA, as recomendações de índice podem ser extremamente úteis.
- As recomendações de índice são capturadas no DMV sys.dm_db_tuning_recommendations, mesmo que as opções de índice CREATE e DROP não estejam habilitadas. Portanto, se você não tiver certeza sobre as alterações que o SQL Server pode fazer, poderá revisar o que é capturado na DMV e tomar a decisão de implementar manualmente a recomendação.
Observação:se você implementar manualmente a recomendação, o SQL Server não realizará nenhuma validação. Se você implementar a recomendação por meio do Portal (através do botão Aplicar) ou da API REST, ela será executada como se fosse uma ação automática, e a validação será realizada (e o índice poderá ser revertido automaticamente se houver uma regressão). - O recurso continua melhorando. Como eu disse antes, a Microsoft não está tentando codificar DBAs ou desenvolvedores desempregados, está tentando lidar com os frutos mais fáceis para que você tenha mais tempo para as tarefas e projetos que não podem ser automatizados de forma inteligente.
ol>
Resumo
Se você não está pronto para entregar as rédeas do gerenciamento de índices, eu entendo. Mas se você tiver um Banco de Dados SQL do Azure no mínimo, verifique o DMV sys.dm_db_tuning_recommendations regularmente para ver o que o SQL Server está recomendando e compare isso com os dados que você ou sua ferramenta de monitoramento de terceiros pode estar capturando sobre o uso do índice. Afinal, quando foi a última vez que você fez uma revisão completa e minuciosa de seus índices para entender o que está faltando, o que realmente está sendo usado e o que está simplesmente gerando sobrecarga no banco de dados?