クイックノート
そのため、以下に問題を書いているときに、自分で修正する方法を見つけました。次の理由から、私はまだ質問を投稿すると思いました。
- 誰かがそれを便利だと思うかもしれません。
- なぜそれが機能するのかあまりわかりません。
とにかく固定コード(回答を参照)。
私はもともと書いた:
私はこれをグーグルで何年も費やしてきましたが、関連する多くの回答を見つけることができますが、私の質問と完全に一致するものはありません.
以下のコードを SQL Server (10) データベースに対して実行すると、非常に高速に実行されます。使用する実行計画には、ハッシュ結合が含まれます。
次に、もう一度実行しますが、今回は最初の 2 行 (DECLARE と SET 行) のコメントを外し、y.[in date] の横にある '+1' も削除し、'+ @COUNTER' のコメントも外します。現在、クエリが完了するまでに (時間の経過に応じて) 時間がかかります。代わりに、ネストされたループを使用する実行計画です。まだ日付に 1 を追加しているだけですが、定数の代わりに変数を使用していることに注意してください。
問題は、@COUNTER を使用したクエリで、ネストされたループの代わりにハッシュ結合を使用できるかどうかです。
(ちょっとした背景: 私がやろうとしているのは、x.[in date] と y.[in date] を大まかに一致させて、指定された日数以内であれば一致するようにすることです。使用するクエリの日数は、別のテーブルのフィールドから入力されます. 最初に abs() と未満で datediff() を使用しようとしましたが、常にネストされたループを使用することになると確信しています. (試してみるとそうです.とにかく!)
さまざまなパラメータ スニッフィングの記事で言及されているすべてのことを試してみましたが、状況は変わりませんでした。とにかく、これをストアドプロシージャとして実行していません。[in date] フィールドのインデックスと何か関係があると思います。)
-- 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