TSQL変数の方がTopの方が速いのはなぜですか?


10

皆さんおはよう、

サードパーティ製品のデータベースからデータを「取得」して、自社の自社アプリケーションで表示するために、ある程度複雑なSQLに取り組んでいます。

サブクエリ内のテーブルからトップレコードを取得するために選択に追加しました(それが理にかなっている場合)

クエリは、100レコードの最終結果セットを返すのに3分近くかかりました。

SELECT TOP 1 ...

私が達成しようとしていたことの改善点をオンラインで見て、以下のように変数を使用するように選択を変更するよう提案されました

DECLARE @topCount INT
SET @topCount = 1

SELECT TOP (@topCount) ...

これは、3分から1秒まで同じクエリを使用しました。

しかし、これがそうである理由を誰かが説明できますか?

回答:


14

あなたが行う場合はtop 1、クエリ・オプティマイザは、できるだけ速くとして1行をフェッチするために構築されているプランを作成します。

ローカル変数を使用する場合、変数の値はオプティマイザには不明であり、代わりに100行をできるだけ速くフェッチするように最適化された計画を構築します。

あなたの場合、行の目標が100で生成されたクエリプランは、1つの行だけが必要な場合でも使用するのに適しています。

検証するにはoption (recompile)、変数を使用してクエリに追加してみます。その場合、SQL Serverはの現在の値を@topCount行の目標として使用し、それが1であるため、スロープランを取得する必要があります。


計画の違いは理解していますが、1行をフェッチする方が100行をフェッチするよりも遅い場合があることに驚きます。100行のプランが最適に機能する場合、SQL Serverはと同じプランを使用すると思いますtop 1
ブランドン

@Brandonは100行をフェッチせず、100行が必要であることを前提に実行プランを構築するだけです。1行が見つかると実行が終了します。
ミカエルエリクソン

おそらく問題は、トップ1であるかを理解するのに役立つだろうこれらの場合に実行計画と違うものを確認する
ジェームズ・Z
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.