次の定数がある場合:
- 同じ構造(テーブル、インデックスなど)を持つ同じデータベース
- 同じデータ
- 同じSQL Serverとハードウェア構成
- 同じ統計
- クライアントの同じSETオプション
- 同じSQL Serverバージョン
- 同じトレースフラグ
これらの定数を指定すると、SQL Serverは特定のクエリに対して常に同じプランを生成しますか?
そうでない場合、他の考慮事項はありますか?考慮すべき非決定性の要素もありますか?
次の定数がある場合:
これらの定数を指定すると、SQL Serverは特定のクエリに対して常に同じプランを生成しますか?
そうでない場合、他の考慮事項はありますか?考慮すべき非決定性の要素もありますか?
回答:
これらの定数を指定すると、SQL Serverは特定のクエリに対して常に同じプランを生成しますか?そうでない場合、他の考慮事項はありますか?考慮すべき非決定性の要素もありますか?
私の知る限り、クエリのコンパイルは決定論的です。元のQO設計の目標の1つは、データベースの統計のみのコピーを使用して、異なるシステムで実行計画を再現できるようにすることでした。これには、使用可能なメモリの量や論理プロセッサの数などの構成パラメーターを中心にいくつかの微妙な点がありますが、これらは同期対象のリストでカバーされています。
警告:リスト内の「同じ」という言葉がすべての点でまったく同じ意味であるとみなされれば、それは事実です。たとえば、2つのシステムに「同じ」統計が存在する場合がありますが、ヒストグラムのステップと密度の情報が同一である場合にのみ正確に同じです。
とはいえ、最適化プロセスも非常に複雑であるため、この決定論的プロセスへのすべての入力が同一であることを保証することは困難であり、すべての内部状態が特定のオプティマイザーを介して同じコードパスを確保するのに十分に類似していることを意味しますコンパイル。クエリにデータベース外(別のデータベースまたはインスタンス)へのアクセスが含まれる場合、それらの環境も同一である必要があります。
リストに追加することの1つは、2番目のデータベースにもプランガイドが存在することを確認することです。
GETDATE()
クエリのように非決定的関数を使用すると、別のプランも得られる可能性があります。メインオプティマイザーは値を直接使用しませんが、カーディナリティー推定は使用できます(カーディナリティー推定中の定数の折りたたみと式の評価を参照)。ただし、両方のシステムが同時に実行されると(または、より一般的には、同じ入力変数、パラメーター、および関数値で)同じプランを作成するため、このクラスの違いが質問の範囲内に収まるかどうかはわかりません。