SQL Serverでの実行計画の作成はどの程度決定的ですか?


13

次の定数がある場合:

  • 同じ構造(テーブル、インデックスなど)を持つ同じデータベース
  • 同じデータ
  • 同じSQL Serverとハードウェア構成
  • 同じ統計
  • クライアントの同じSETオプション
  • 同じSQL Serverバージョン
  • 同じトレースフラグ

これらの定数を指定すると、SQL Serverは特定のクエリに対して常に同じプランを生成しますか?

そうでない場合、他の考慮事項はありますか?考慮すべき非決定性の要素もありますか?


同じ計画を言うのは間違っていますが、同様の計画を言うことができます。DBA /開発者が制御できる外部要因とともに; 「クエリプラン最適化アルゴリズム」および「内部クエリコストアルゴリズム」は、SQLサーバーエンジン内に記述されています。「何を選択するか」をあらゆる方法で伝えることはできません。外部envを設定して、最適なエンジンを選択するようにエンジンをガイドできます。特定のクエリに対して、オプティマイザが0.001のコスト差を伴う2つの実行プランを考え出した場合、どの実行プランを選択するかは関係ないと思います。
アヌプシャー

私はあなたがこれについて理論的であるべきだとは思わない。私はさまざまなデータベースで25年間働いてきましたが、ほとんどの場合、クエリを書き換えて実行を改善することができました。また、クエリを記述する1つの方法を使用するほうが良い理由を理解するのが非常に難しい場合があります。

回答:


13

これらの定数を指定すると、SQL Serverは特定のクエリに対して常に同じプランを生成しますか?そうでない場合、他の考慮事項はありますか?考慮すべき非決定性の要素もありますか?

私の知る限り、クエリのコンパイルは決定論的です。元のQO設計の目標の1つは、データベースの統計のみのコピーを使用して、異なるシステムで実行計画を再現できるようにすることでした。これには、使用可能なメモリの量や論理プロセッサの数などの構成パラメーターを中心にいくつかの微妙な点がありますが、これらは同期対象のリストでカバーされています。

警告:リスト内の「同じ」という言葉がすべての点でまったく同じ意味であるとみなされれば、それは事実です。たとえば、2つのシステムに「同じ」統計が存在する場合がありますが、ヒストグラムのステップと密度の情報が同一である場合にのみ正確に同じです

とはいえ、最適化プロセスも非常に複雑であるため、この決定論的プロセスへのすべての入力が同一であることを保証することは困難であり、すべての内部状態が特定のオプティマイザーを介して同じコードパスを確保するのに十分に類似していることを意味しますコンパイル。クエリにデータベース外(別のデータベースまたはインスタンス)へのアクセスが含まれる場合、それらの環境も同一である必要があります。

リストに追加することの1つは、2番目のデータベースにもプランガイドが存在することを確認することです。


GETDATE()クエリのように非決定的関数を使用すると、別のプランも得られる可能性があります。メインオプティマイザーは値を直接使用しませんが、カーディナリティー推定は使用できます(カーディナリティー推定中の定数の折りたたみと式の評価を参照)。ただし、両方のシステムが同時に実行されると(または、より一般的には、同じ入力変数、パラメーター、および関数値で)同じプランを作成するため、このクラスの違いが質問の範囲内に収まるかどうかはわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.