メモの構造が整理され、一部の高価な代替プランが最適化中に破棄されることがわかっています。これを防ぐ方法はありますか?オプティマイザにすべての可能な計画を検討させ、すべての選択肢から最適なものを選択させますか?
a hash join bコストが10以上であることがわかった場合、それらの100万個のプランすべてを計算し、それらをプルーニングしないのはなぜですか?(オプティマイザは、このような単純な方法で動作しないよう)
メモの構造が整理され、一部の高価な代替プランが最適化中に破棄されることがわかっています。これを防ぐ方法はありますか?オプティマイザにすべての可能な計画を検討させ、すべての選択肢から最適なものを選択させますか?
a hash join bコストが10以上であることがわかった場合、それらの100万個のプランすべてを計算し、それらをプルーニングしないのはなぜですか?(オプティマイザは、このような単純な方法で動作しないよう)
回答:
メモの構造が整理され、一部の高価な代替プランが最適化中に破棄されることがわかっています。これを防ぐ方法はありますか?オプティマイザにすべての可能な計画を検討させ、すべての代替案から最適なものを選択させますか?
ありますが、誤解や誤用されてしまうので公表しません。いずれの場合も、限られた一連の変換(通常は良好な結果を生成する変換)のみが実装されるため、プランスペースの徹底的な検索は行われません。
一般に、プルーニングと破棄を防ぐと、最終的な計画の品質が改善されていなくても、コンパイル時間が(はるかに)長くなります。
結局のところ、問題は自然で合理的なものですが、SQL Serverクエリオプティマイザーの目標の誤解に基づいています。これは、一般的なクエリの適切な計画をすばやく見つけることを目的としています。網羅的な検索を目的として設計されたフレームワークには基づいていません。
最適化への別のアプローチの恩恵を受ける現実の状況がある場合は、ConnectのWebサイトでそれを主張することができます(ただし、Microsoftが必要なエンジニアリングリソースを投資する可能性は低いと思います)。
私がこの動作を強制するために知っているノブやトレースフラグはありません(Paul Whiteは、ここで、より多くの可視性を提供し、動作のデルタを調整できるようにするいくつかのトレースフラグについて言及しています)。
マイクロソフトはたくさんの武器を提供していますが、これはほぼ100%の確率で自分の足を真っ直ぐに向けていることを保証します。クエリを初めて実行するとき、SQL Serverが計画のすべての可能なバリエーションを構築して無限の時間を費やして、望ましい結果を得るようにしたいとは思わないでしょう。@ypercubeが言及しているように、これは非常に多数のプランになる可能性があり、クエリを実行する目的をまったく無効にします。おそらく最初にクエリを実行する目的は、ある時点でデータを返すことでしょう。また、アプリケーションの特定のレイヤーにはさまざまなクエリ/コマンドタイムアウトが適用され、ユーザーはページが読み込まれるのを長く待つだけなので、「いくつかのポイント」は特定のしきい値内になければなりません...