SQL Server, TOP против ROW_NUMBER

8

Я изучаю планы выполнения и пробую разные запросы, сравниваю их производительность и наткнулся на это:

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 не имеет хороших переписываний запросов для пейджинговых запросов. Эти различия в плане и оценке не должны существовать для такого общего случая.
USR

Ответы:

11

Я полагаю, вы сравниваете предполагаемые затраты на запросы. Это всего лишь оценки, основанные (среди прочего) на оценочном количестве строк, возвращаемых запросом. Не фактическое количество строк.

Ваш первый запрос оценил, что он возвратит 30 строк, а ваш второй запрос оценил 1000 строк. Вот откуда ваша разница в стоимости запроса.

Если вы измените запросы на выборку только 30 строк, вы увидите, что оценочные строки одинаковы для запросов, а первый запрос фактически стоит немного выше, по крайней мере, для меня в SQL Server 2014.

Не используйте оценки при сравнении производительности запросов. Вместо этого используйте такие вещи, как продолжительность, количество операций чтения и размер памяти.

Микаэль Эрикссон
источник
1
Чтобы определить фактическую производительность, выполните каждый из запросов несколько раз (GO 10) с параметром «Включить статистику клиента». Я подозреваю, что вы найдете фактическое время выполнения ближе, чем оценки относительной стоимости. Под одеялами нет магии; операторы плана запроса рассказывают реальную историю.
Дан Гусман
Значит ли относительная стоимость (процентное выражение) что-то в SSMS? Это беспокоило меня больше всего.
Эвалдас Буйнаускас
@EvaldasBuinauskas Не уверен, что относительная стоимость полезна для чего-либо. Возможно, иногда, но я не думаю, что это может стоить всей путаницы, которую он создает, когда люди начинают использовать предполагаемый процент для сравнения производительности различных запросов. Это всегда будет оценка, а оценки всегда (почти) неверны.
Микаэль Эрикссон
@EvaldasBuinauskas, эти затраты собираются в процессе оптимизации и выставляются, но не предназначены для того, чтобы быть индикатором или фактическим временем выполнения. Стоимость - это только лучшее предположение. См. Blogs.msdn.com/b/sqlqueryprocessing/archive/2006/10/11/…
Дан Гузман