SQL Server Hashは、ネストされたループと結合されます
-
27-09-2019 - |
質問
クイックノート
だから、以下の問題を書いていたとき、私はそれを自分で修正する方法を見つけました。私はまだ質問を投稿すると思いました:
- 誰かがそれが便利だと思うかもしれません。
- なぜそれが機能するのか、あまり理解していません。
とにかく固定コード(回答を参照)。
私はもともと書いた:
私はこれをグーグルでグーグルで費やし、多くの関連する答えを見つけることができますが、私の質問に正確に一致するものはありません。
以下のコードをSQL Server(10)データベースに対して実行すると、非常に高速に実行されます。使用する実行計画には、ハッシュ結合が含まれます。
その後、もう一度実行しますが、今回は最初の2行(宣言および設定)を外し、[日付]の横に「+1」を削除し、「+ @Counter」を削除します。これで、クエリには(年齢の時)に完了するには、ネストされたループを使用する代わりに実行計画が必要です。注意してください。私はまだ日付にそれを追加するだけですが、定数ではなく変数を使用しています。
問題は、@Counterを使用してクエリを作成して、ネストされたループの代わりにハッシュ結合を使用できますか?
(背景の少し:私がやろうとしているのは、Xをゆるく一致させることです。[日付]とy。使用するクエリの日は別のテーブルのフィールドから入力されます。私は最初にABS()以下でdatediff()を使用しようとしましたが、それは常にネストされたループを使用すると確信しています(それは私が試してみるとそうですとにかく!)
私はさまざまなパラメータースニッフィング記事で言及されているすべてを実行しようとしましたが、それらは物事を変えませんでした。とにかく、私はこれをストアドプロシージャとして実行していません。 [日付]フィールドのインデックスと関係があると思います。 ))
-- DECLARE @COUNTER INT
-- SET @COUNTER = 1
BEGIN
SELECT
x.[line id]
, y.[line id]
FROM
lines1 AS x
JOIN lines2 AS y ON (
x.[in date] = y.[in date] + 1 -- + @COUNTER
AND x.[country] = y.[country]
)
WHERE
x.[country] = 'USA'
END
解決
問題は、@Counterを使用してクエリを作成して、ネストされたループの代わりにハッシュ結合を使用できますか?
はい。参加ヒントを使用してこれを強制することができます。
INNER HASH JOIN