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クエリプランエクスプローラーとの比較: ここに画像の説明を入力してください 実際に舞台裏で何が起こっているのか、なぜ結果が異なるのかについて誰かに洞察を与えることはできますか?他に必要なものがあれば、お知らせください。

ありがとう、エヴァルダス。


何らかの理由で、SQL Serverにはページングクエリ用の適切なクエリリライトがありません。このような一般的なケースでは、計画と見積もりの​​これらの違いは存在しないはずです。
usr

回答:


11

クエリの推定コストを比較していると思います。これらは、(とりわけ)クエリによって返された推定行数に基づく推定にすぎません。実際の行数ではありません。

最初のクエリは30行を返すと推定し、2番目のクエリは1000行を推定しました。これが、クエリコストの違いの原因です。

クエリを変更して30行のみをフェッチするようにすると、クエリの推定行は同じであり、最初のクエリのコストは実際には少し高くなります(少なくともSQL Server 2014では)。

クエリのパフォーマンスを比較するときは、推定値を使用しないでください。代わりに、期間、読み取り回数、メモリ許可のサイズなどを使用してください。


1
実際のパフォーマンスを確認するには、[クライアント統計を含める]オプションを使用して、各クエリを数回(GO 10)実行します。実際の実行時間は、相対的なコストの見積もりよりも近いと思います。裏には魔法はありません。クエリプランのオペレーターが実際の話をします。
Dan Guzman

相対コスト(パーセント表現)は実際にSSMSで何かを意味しますか?それは私を最も悩ませていました。
Evaldas Buinauskas 2015年

@EvaldasBuinauskas相対コストが何かに役立つかどうかはわかりません。おそらくときどきですが、人々が推定されたパーセンテージを使用してさまざまなクエリのパフォーマンスを比較し始めたときに発生する混乱に値することはないと思います。それは常に見積もりであり、見積もりは常に(ほとんど)間違っています。
ミカエルエリクソン

@EvaldasBuinauskas、これらのコストは最適化プロセス中に収集されて公開されますが、インジケーターや実際の実行時間を目的とするものではありません。コストは単なる推測です。blogs.msdn.com/b/sqlqueryprocessing/archive/2006/10/11/を
Dan Guzman、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.