Eu estou querendo saber sobre índice não utilizado no MS SQL Server. Pelo uso do índice DMV posso identificar um índice que não foi usado para buscas, varreduras ou pesquisas.
No entanto, eu sei da Oracle que um índice pode não ser usado dessa maneira em um plano de execução, mas ainda pode contribuir com informações de estatísticas/cardinalidade para o otimizador (Oracle). Essa contribuição não é monitorada da mesma forma.
Então eu estou querendo saber se no MSSQL um índice pode ter um efeito positivo semelhante mesmo quando não é usado diretamente (em um período de tempo representativo)? E, especificamente, se puder ser melhor do que uma estatística de coluna (ou seja, descartar o índice seria prejudicial).
Eu não vi isso mencionado em nenhum dos artigos de ajuste de índice que encontrei, então presumo que o MSSQL (até 2017) não tenha esse conceito, está correto?
Sim, as estatísticas baseadas em índices podem ser usadas para ajudar na criação do plano de consulta, mesmo que o índice subjacente não seja usado para acessar dados no plano. Considere que o otimizador de consulta pode considerar muitos planos de consulta e caminhos de acesso a dados diferentes ao criar um plano de consulta. O plano de consulta compilado pode acabar não usando um dos índices considerados. Isso certamente não significa que qualquer plano de consulta que tenha se beneficiado das estatísticas desse índice precise ser invalidado, certo?
Um exemplo pode ser útil também. Primeiro, vou jogar cerca de 6,5 milhões de linhas em uma pilha:
Em seguida, criarei um índice em uma das colunas e examinarei o histograma do objeto de estatísticas que é criado automaticamente.
Segue o histograma:
Com base nas estatísticas, há 5806440 linhas na tabela com valor 1 para
INDEXED_COLUMN
. Agora considere esta consulta:O otimizador de consulta tem alguns caminhos de acesso diferentes para os dados. Ele também tem algumas opções de como calcular o agregado. Uma das considerações para a escolha de um algoritmo para o agregado é a estimativa de cardinalidade dos dados. Aqui está uma captura de tela do plano de consulta:
Observe que a estimativa corresponde exatamente ao histograma, mesmo que o índice não seja usado para acessar os dados. As versões mais recentes do SQL Server mostram quais estatísticas foram consideradas durante a otimização no plano de consulta. Você pode ver que a estatística associada ao índice foi usada:
No entanto, o
sys.dm_db_index_usage_stats
dmv não relata nenhuma atividade do usuário final no índice.