ハッシュヒントを試すときはどうですか?
- 少なくとも1つのテーブルに適切なインデックスが存在することを確認した後。
- クエリを再配置しようとした後。結合を「in」または「exists」に変換する、結合順序を変更する(これはとにかく実際にはヒントにすぎません)、where句からjoin条件にロジックを移動するなどです。
ハッシュ結合が有効な場合の基本的なルールは、結合条件がテーブルインデックスとして存在しない場合と、テーブルのサイズが異なる場合です。技術的な説明を探している場合は、ハッシュ結合がどのように機能するかについての良い説明がいくつかあります。
結合ヒント(強制順序の副作用を伴うハッシュ/マージ/ループ)を使用するのはなぜですか?
- コーナーケースの実行が極端に遅くなる(.5-> 10.0s)のを避けるため。
- オプティマイザーが一貫して平凡な計画を選択する場合。
提供されたヒントは、状況によっては理想的ではない可能性がありますが、より一貫して予測可能なランタイムを提供します。ヒントを使用する場合は、予想される最悪のシナリオと最良のシナリオを事前にテストする必要があります。予測可能なランタイムは、厳密に最適化された公称[.3s、.6s]クエリが、たとえば[.25、10.0s]の範囲のクエリよりも優先されるWebサービスにとって重要です。統計が新たに更新され、ベストプラクティスに従っている場合、実行時の大きな変動が発生する可能性があります。
開発環境でテストする場合は、実行時のホット/コールドの変動を回避するために、「不正行為」もオフにする必要があります。別の投稿から...
CHECKPOINT -- flushes dirty pages to disk
DBCC DROPCLEANBUFFERS -- clears data cache
DBCC FREEPROCCACHE -- clears execution plan cache
最後のオプションは、option(recompile)ヒントと同じである可能性があります。
MAXDOPとマシンのロードも、実行時に大きな違いを生む可能性があります。CTEを一時テーブルに具体化することも、優れたロックダウンメカニズムであり、考慮すべき点です。