Я изучаю планы выполнения и пробую разные запросы, сравниваю их производительность и наткнулся на это:
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
Они оба возвращают один и тот же набор результатов - однако первый выполняется быстрее и требует меньше ресурсов (по крайней мере, SSMS говорит мне об этом). Вот планы выполнения:
Сравнение с SQL Query Plan Explorer. Может ли кто-нибудь дать мне некоторое представление о том, что на самом деле происходит за кулисами и почему результаты отличаются? Если есть что-то еще, что вам нужно - просто дайте мне знать.
Спасибо, Эвалдас.
sql-server
query-performance
execution-plan
Эвалдас Буйнаускас
источник
источник
Ответы:
Я полагаю, вы сравниваете предполагаемые затраты на запросы. Это всего лишь оценки, основанные (среди прочего) на оценочном количестве строк, возвращаемых запросом. Не фактическое количество строк.
Ваш первый запрос оценил, что он возвратит 30 строк, а ваш второй запрос оценил 1000 строк. Вот откуда ваша разница в стоимости запроса.
Если вы измените запросы на выборку только 30 строк, вы увидите, что оценочные строки одинаковы для запросов, а первый запрос фактически стоит немного выше, по крайней мере, для меня в SQL Server 2014.
Не используйте оценки при сравнении производительности запросов. Вместо этого используйте такие вещи, как продолжительность, количество операций чтения и размер памяти.
источник