オプティマイザーは、実行可能なすべての実行計画を調査するために必要な時間をすべてとることができないため(実行時間を最小化する必要があります)、カットされることがあります。
これをオーバーライドして、オプティマイザーに必要に応じて常に(または一定のミリ秒単位で)渡すことができるかどうか疑問に思っていました。
この(atm)の必要はありませんが、複雑なクエリがタイトループで実行され、最適なプランを考え出し、それを事前にキャッシュするシナリオを想像できます。
もちろん、ループがタイトであるため、クエリを書き換えて、それがなくなるようにしてください。
これは、好奇心からの質問であり、短絡最適化と完全最適化の間に時々違いがあるかどうかを確認することでもあります。
トレースフラグ2301を使用すると、オプティマイザーにより多くの時間を与えることができます。これは、私が求めていたものとはまったく異なりますが、近づいています。
これについて私が見つけた最高の情報は、Ian JoseによるSQL Server 2005 SP1のQuery Processor Modeling Extensionsにあります。
このトレースフラグは注意して使用してください!しかし、より良い計画を思いつくときに役立ちます。こちらもご覧ください:
- Grant Fritchey が「最適化レベル」とタグ付けした記事。
- SQL Server 2008にアップグレードする前に… Brent Ozar作。
- Microsoftサポートにより、高パフォーマンスのワークロードで実行されている場合のSQL Serverのチューニングオプション。
結合順序のソリューション空間が指数関数的に爆発する、多くの結合を持つクエリについて考えていました。SQL Serverが使用するヒューリスティックは非常に優れていますが、時間があれば(数秒から数分)オプティマイザーが別の順序を提案するのではないかと考えていました。