SQL SERVER 2008 JOIN ヒント
-
20-09-2019 - |
質問
最近、このクエリを最適化しようとしていました
UPDATE Analytics
SET UserID = x.UserID
FROM Analytics z
INNER JOIN UserDetail x ON x.UserGUID = z.UserGUID
推定実行計画は、テーブル更新で 57%、ハッシュ マッチ (集計) で 40% を示しています。いろいろ調べてみたところ、JOIN ヒントというトピックを見つけました。そこで、内部結合と WA-ZHAM! に LOOP ヒントを追加しました。新しい実行計画は、テーブル更新で 38%、インデックス シークで 58% を示しています。
そこで私は、慎重さがなくなるまで、すべてのクエリに LOOP ヒントを適用し始めようとしていました。少しグーグルで調べたところ、JOIN ヒントについてはあまり詳しく説明されていないことがわかりました。 ボル. 。したがって...
- すべてのクエリに LOOP ヒントを適用することが悪い考えである理由を誰か教えてください。LOOP JOIN がクエリ オプティマイザーのデフォルトの JOIN メソッドであるとどこかで読みましたが、ステートメントの有効性を確認できませんでした。
- JOIN ヒントはいつ使用されますか?ファンが大騒ぎになって、ゴーストバスターズが街にいないときは?
- LOOP、HASH、MERGE ヒントの違いは何ですか?BOL は、MERGE が最も遅いようだと述べていますが、各ヒントはどのように適用されますか?
時間を割いて人々を助けてくれてありがとう!
ちなみに私はSQL Server 2008を実行しています。上記の統計は、推定された実行計画です。
解決
すべてのクエリに LOOP ヒントを適用することが悪い考えである理由を誰か教えてください。LOOP JOIN がクエリ オプティマイザーのデフォルトの JOIN メソッドであるとどこかで読みましたが、ステートメントの有効性を確認できませんでした。
これは、オプティマイザがより効率的な他の方法を検討する機会を奪うからです。
JOIN ヒントはいつ使用されますか?ファンが大騒ぎになって、ゴーストバスターズが街にいないときは?
データ分布 (オプティマイザが決定を行う際の基準) が著しく偏っていて、統計がそれを正しく表現できない場合。
LOOP、HASH、MERGE ヒントの違いは何ですか?BOL は、MERGE が最も遅いようだと述べていますが、各ヒントはどのように適用されますか?
これらは異なるアルゴリズムです。
LOOP
ネストされたループです:外部テーブルのレコードごとに、内部テーブルで一致するものが検索されます (利用可能なインデックスを使用)。両方のテーブルのレコードのごく一部のみが条件を満たす場合に最も高速になります。JOIN
そしてそのWHERE
条件。MERGE
ソートでは、両方のテーブルがソート順に走査され、一致しないレコードがスキップされます。最速のFULL JOIN
両方のレコードセットがすでに並べ替えられている場合 (以前の並べ替え操作またはインデックス アクセス パスが使用されている場合)HASH
一時ストレージ(メモリまたはtempdb
) を一方のテーブルから取得し、もう一方のテーブルから各レコードを検索します。いずれかのテーブルのレコードの大部分が一致する場合に最も速くなります。WHERE
そしてJOIN
状態。
他のヒント
推定実行プランを表示57% ハッシュ表を更新し、40%に マッチ(集約)。私はいくつかのスヌーピングをしました 周りとの話題に出くわしました ヒントを登録しよう。だから私はにLOOPヒントを追加しました 私の内部には参加して、WA-ZHAM!新しい 実行計画は、表の上に38%を示し インデックスの更新と58%がシークます。
確かにそれはあなたの提案計画が悪化していることを意味しますか?テーブルの更新を仮定すると、それは今のインデックスの活動によって出ているが負けましれる一定の時間がかかります。