Atualmente, meu banco de dados possui um índice primário de chave/cluster na ID
coluna de cada tabela. No entanto, o aplicativo que se conecta ao banco de dados está sempre procurando visualizações definidas como:
SELECT * FROM Table WHERE DeletedDate IS NULL
Seria melhor adicionar o DeletedDate
ao índice clusterizado ou é uma prática melhor ter um índice não clusterizado com o DeletedDate
como uma inclusão?
Como estamos falando sobre o índice clusterizado, apenas porque você definiu a coluna de chave do CI como
ID
, você ainda terá osDeletedDate
dados nas páginas de dados folha do índice. Essa é a natureza do índice clusterizado: são os dados da tabela.Porque você normalmente está tendo consultas que se parecem com:
Você provavelmente se beneficiará de um índice filtrado.
Não coloquei explicitamente as colunas-chave aqui (e as colunas não-chave por meio do uso da
INCLUDE
cláusula) porque você não publicou o DDL de sua tabela.Como no meu comentário acima à sua pergunta, a escolha das colunas-chave (não apenas colunas, mas também a ordem das colunas) dependerá muito da sua carga de trabalho e das consultas típicas que usariam esse índice.
Se você deseja cobrir sua(s) consulta(s), precisará garantir que o índice satisfaça todos os dados exigidos da(s) consulta(s). Sem mencionar que, se você tiver outras
WHERE
cláusulas (além de suaNULL
verificação emDeletedDate
) ou junções a serem consideradas, a ordem de suas colunas-chave pode ser o fator decisivo entre uma varredura ou uma busca. E mesmo sendo filtrado, e dependendo da quantidade de dados que você tem no índice, a penalidade pode ser considerável.Clustered index key
funciona melhor para ser único, estreito, estático e sempre crescente por si só. Portanto, neste caso, a inclusão de DeletedDate realmente resulta em que a chave agrupada se tornenão exclusiva enão estática (presumindo que o valor DeletedDate possa ser alterado).O
INCLUDE
no índice não clusterizado é útil para cobrir a consulta sem ter que executar uma pesquisa de chave na tabela. Porém, como as colunas INCLUDE são armazenadas apenas no nível folha do índice, não auxilia na busca dos valores do predicado da consulta (neste caso, NULL)A
non-clustered index key
de DeletedDate permite uma busca mais efetiva no intervalo de registros que satisfazem o predicado (NULL). Um índice não agrupado filtrado pode restringir ainda mais o subconjunto (somente registros NULL) e fornecer um melhor desempenho, bem como armazenamento para o índice não agrupado.Com sua descrição mostrando que a consulta retorna todas as colunas da tabela com um único predicado, você pode criar uma única chave de índice não clusterizada filtrada para DeletedDate com
WHERE DeletedDate IS NULL
. Teste-o e examine o plano de execução.