SQL Server, TOP versus ROW_NUMBER

8

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: Planos de execução

Comparação do SQL Query Plan Explorer: insira a descrição da imagem aqui 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.

Evaldas Buinauskas
fonte
Por algum motivo, o SQL Server não possui boas regravações de consulta para consultas de paginação. Essas diferenças de plano e estimativa não deveriam existir para um caso tão comum.
21715 $ usr $

Respostas:

11

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.

Mikael Eriksson
fonte
11
Para verificar o desempenho real, execute cada uma das consultas várias vezes (GO 10) com a opção Incluir Estatísticas do Cliente. Eu suspeito que você encontrará que os tempos de execução reais são mais próximos do que as estimativas de custo relativo. Não há mágica debaixo das cobertas; os operadores do plano de consulta contam a história real.
Dan Guzman
O custo relativo (expressão percentual) realmente significa algo no SSMS? Isso estava me incomodando mais.
Evaldas Buinauskas 19/03/2015
@EvaldasBuinauskas Não tenho certeza se o custo relativo é útil para alguma coisa. Talvez às vezes, mas não creio que isso possa valer toda a confusão que cria quando as pessoas começam a usar a porcentagem estimada para comparar o desempenho de diferentes consultas. Será sempre uma estimativa e as estimativas estão sempre (quase) erradas.
Mikael Eriksson
@EvaldasBuinauskas, esses custos são coletados durante o processo de otimização e expostos, mas não pretendem ser um indicador ou tempos de execução reais. Os custos são apenas um palpite. Veja blogs.msdn.com/b/sqlqueryprocessing/archive/2006/10/11/…
Dan Guzman