Preciso de ajuda para analisar alguns planos simples de execução do t-sql. Tenho uma tabela [User] com as 3 colunas a seguir:
Id(chave primária), nome de usuário(nvarchar(50)), nome(nvarchar(50))
Eu criei um índice não agrupado exclusivo para a coluna de nome de usuário
O plano de execução para uma filtragem de consulta por FirstName:
select * from [User] where FirstName ='John'
mostra um Clustered Index Scan com um custo total de 0,0033095
O plano de execução para outra filtragem de consulta por nome de usuário:
select * from [User] where Username = 'johndoe'
mostra um loop aninhado contendo um Index Seek seguido por um Clustered Index Seek com um custo total de 0,00657038! isso é o dobro do custo da consulta anterior e não entendi!
Há um índice associado à coluna Username e nenhum índice associado a FirstName, espero que a segunda consulta seja mais rápida.
O custo total quase sempre não é confiável para coisas como esta
eu usaria
STATISTICS IO
eSTATISTICS TIME
em vez dissoexecute as duas consultas e observe a diferença nas leituras
e você também pode ver a hora usando este
Exatamente como esperado... :-)
A primeira será uma varredura clusterizada/PK direta
A segunda será uma busca de índice na coluna UserName seguida por uma pesquisa de chave/marcador no índice clusterizado.
Você normalmente faria o índice em UserName em um índice de cobertura ... o que geralmente é inútil de
SELECT *
qualquer maneira.Perguntas relacionadas ao SO:
Pela sua pergunta, deduzo que sua mesa é relativamente pequena. À medida que você colocar mais linhas na tabela, descobrirá que a pesquisa de favoritos permanece praticamente a mesma e a verificação leva cada vez mais tempo. Eventualmente, a digitalização custará muitas vezes mais do que a pesquisa de favoritos.
Como o SQLMenace disse, os custos do plano de execução geralmente não são confiáveis. Use o Query Profiler ou SET STATISTICS para ver quais recursos estão realmente sendo consumidos por cada consulta.
Por fim, certifique-se de que as estatísticas sejam atualizadas em sua tabela ou o mecanismo poderá fazer escolhas ruins sobre quais índices ou tabelas usar em qual ordem.