Estou aprendendo sobre os planos de execução e testando diferentes consultas, comparando seu desempenho e deparamos com isso:
SELECT StatisticID
FROM (
SELECT StatisticID, ROW_NUMBER() OVER (ORDER BY StatisticID) AS rn
FROM FTCatalog.Statistic
) AS T
WHERE T.rn <= 1000
ORDER BY rn
SELECT TOP 1000 StatisticID
FROM FTCatalog.Statistic
ORDER BY StatisticID
Ambos retornam o mesmo conjunto de resultados - no entanto, o primeiro é executado mais rapidamente e consome menos recursos (pelo menos o SSMS me diz isso) Aqui estão os planos de execução:
Comparação do SQL Query Plan Explorer: Alguém poderia me dar uma ideia do que realmente está acontecendo nos bastidores e por que os resultados diferem? Se precisar de mais alguma coisa, me avise.
Obrigado, Evaldas.
sql-server
query-performance
execution-plan
Evaldas Buinauskas
fonte
fonte
Respostas:
Eu acho que você está comparando os custos estimados para as consultas. Essas são apenas estimativas baseadas (entre outras coisas) no número estimado de linhas retornadas pela consulta. Não é o número real de linhas.
Sua primeira consulta estimou que retornaria 30 linhas e sua segunda consulta estimou 1000 linhas. É daí que vem a sua diferença no custo da consulta.
Se você alterar as consultas para buscar apenas 30 linhas, verá que as linhas estimadas são as mesmas para as consultas e a primeira consulta realmente custa um pouco mais, pelo menos para mim no SQL Server 2014.
Não use as estimativas ao comparar o desempenho das consultas. Use coisas como duração, número de leituras e tamanho das concessões de memória.
fonte