Pergunta

Os nossos sites estão ficando bateu muito difícil, então estamos tendo um olhar para otimizar algumas das nossas consultas existentes.

Ao olhar para isso, correu várias consultas cujo plano de execução foi de cerca de 4-5 vezes mais rápido quando uma simples referência do índice agrupado é na consulta ... por exemplo

Se esta foi a consulta de idade:

SELECT ...
FROM myTable
WHERE categoryID =  @category 

a seguinte consulta seria 4 vezes mais rápido de acordo com o plano de execução no SSMS:

SELECT ...
FROM myTable
WHERE categoryID =  @category 
AND lotID = lotID

Não podemos parecem fazer sentido de como isso iria fazer a consulta mais rápida. O índice de cluster está em lotID mas desde a sua fazendo uma comparação contra si mesmo como é que isto ajudar?

Foi útil?

Solução

parece bastante óbvio para mim

sua primeira consulta não é coberto pelo índice agrupado enquanto o segundo é desde lotID não é na cláusula WHERE da primeira consulta

Você pode querer ler índices SQL cobrindo Servidor para ver como é que tudo funciona

Você também precisa entender que um índice agrupado são os dados, todos os dados de uma tabela está no índice agrupado. quando você cria um índice não agrupado na tabela que tem um índice de cluster, em seguida, o índice não agrupado terá um ponteiro para o índice agrupado (uma vez que é onde o resto dos dados é) a menos que você pode satisfazer sua consulta completamente pela não agrupado índice e, nesse caso, será utilizado apenas o índice não agrupado ... vou parar de divagar agora

Editar

Eu li E lotID = @lotID NÃO E lotID = lotID

Às vezes você pode fingir um índice agrupado fazendo onde lotID> 0 (escolhendo o menor número que você tem), e você obterá uma busca

Portanto, se seu menor lotID = 1 e você adicionar E lotID> 0

Você também pode ver uma busca, em vez de uma varredura, eu demonstro ONDE IndexValue> '' neste post é um índice procuram sempre melhor ou mais rápido do que uma varredura de índice?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top