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