Coluna incluída versus índice filtrado

11

Atualmente, trabalhamos com a tabela denominada tb_tranfers . Esta tabela possui 40 milhões de linhas e tem ~ 26 GB de tamanho (dados de 11 GB, índices de 15 GB).

10 a 15% das linhas são linhas com exclusão eletrônica ( DeletedDate não é nulo). O aplicativo usa apenas linhas em que DeletedDate é nulo. Todas as consultas a esta tabela incluirão uma cláusula para esse efeito.

Existem 15 índices nesta tabela. O DMV de índice ausente contém sugestões para criar índices com DeletedDate como uma coluna incluída.

Seria útil usar um índice filtrado WHERE DeleteDdate IS NULLem todos os 11 índices não-agrupados? Ou seria melhor ter a coluna DeletedDate como uma coluna incluída?

Paul White 9
fonte

Respostas:

12

Sim, modificar todos os 11 índices NC para serem filtrados ( CREATE INDEX ... ON ... WHERE DeletedDate IS NULL) ajudaria. Dessa forma, você obtém duas vantagens:

  • O Query Optimizer vai saber que qualquer linha proveniente destes índices já não satisfazer os seus filtros de consulta on DeletedDate, por isso não terá que procurar o índice agrupado, e verifique o DeletedDate
  • Todos os índices NC terão tamanho 10-15% menor, exigindo menos memória e menos operações de E / S para pesquisa.

A desvantagem é que qualquer consulta que cuide de linhas excluídas temporariamente (e deve haver alguma consulta, caso contrário, por que as linhas existem?) Será incapaz de usar esses índices NC.

Remus Rusanu
fonte
7

Se você SEMPRE usar o DeletedDate IS NULLfiltro em suas consultas, provavelmente verá um aumento significativo no desempenho adicionando o filtro.

É muito menos páginas para o mecanismo verificar para encontrar as linhas relevantes, o que significa menos IO (e mais velocidade).

Adicioná-lo como um INCLUDEDcampo seria inútil . Como você sempre o inclui no filtro (mas provavelmente nunca o adiciona à lista SELECT), esse campo nunca seria mencionado se você o adicionar como um INCLUDE.

JNK
fonte
2

Como 85-90% das linhas têm DeletedDate são NULL, é improvável que a seletividade de um índice que consiste apenas em DeletedDate seja suficiente para o SQL usar esse índice. No entanto, usado em conjunto com outras colunas mais seletivas, anexar DeletedDate aos índices existentes deve oferecer algum benefício se aumentar a seletividade geral do índice.

Como JNK diz, DeletedDate seria pouco útil para cobrir índices, a menos que você o use na cláusula SELECT.

Como já existe mais armazenamento para índices do que para dados, você também pode querer ver se há alguma redundância nos 15 índices NC existentes.

StuartLC
fonte