Estou aprendendo sobre planos de execução e estou experimentando diferentes consultas e comparando seu desempenho e me deparei 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 algumas dicas sobre o que realmente está acontecendo nos bastidores e por que os resultados diferem? Se precisar de mais alguma coisa, é só me avisar.
Obrigado, Evaldas.
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 1.000 linhas. É daí que vem a 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 tem um custo um pouco maior, pelo menos para mim no SQL Server 2014.
Não use as estimativas ao comparar o desempenho das consultas. Em vez disso, use coisas como duração, número de leituras e tamanho das concessões de memória.