オプティマイザーに必要な時間を増やすことはできますか?


18

オプティマイザーは、実行可能なすべての実行計画を調査するために必要な時間をすべてとることができないため(実行時間を最小化する必要があります)、カットされることがあります。

これをオーバーライドして、オプティマイザーに必要に応じて常に(または一定のミリ秒単位で)渡すことができるかどうか疑問に思っていました。

この(atm)の必要はありませんが、複雑なクエリがタイトループで実行され、最適なプランを考え出し、それを事前にキャッシュするシナリオを想像できます。

もちろん、ループがタイトであるため、クエリを書き換えて、それがなくなるようにしてください。

これは、好奇心からの質問であり、短絡最適化と完全最適化の間に時々違いがあるかどうかを確認することでもあります。

トレースフラグ2301を使用すると、オプティマイザーにより多くの時間を与えることができます。これは、私が求めていたものとはまったく異なりますが、近づいています。

これについて私が見つけた最高の情報は、Ian JoseによるSQL Server 2005 SP1のQuery Processor Modeling Extensionsにあります

このトレースフラグは注意して使用してください!しかし、より良い計画を思いつくときに役立ちます。こちらもご覧ください:

結合順序のソリューション空間が指数関数的に爆発する、多くの結合を持つクエリについて考えていました。SQL Serverが使用するヒューリスティックは非常に優れていますが、時間があれば(数秒から数分)オプティマイザーが別の順序を提案するのではないかと考えていました。

回答:


16

トレースフラグ2301の隣には、本当にそれだけでそれをより多くの時間を与えるため、「難しい仕事」オプティマイザを作るん8780あります(無制限ではない、詳細に説明するように、ここで(ロシア)とあまり詳細にここで)そのことを行います。

ロシアの記事の原作者の英語による詳細な説明。著者自身の警告が含まれています:

実稼働環境で使用することはお勧めしません

2つを組み合わせて、それらを(クエリヒントOPTION(QUERYTRACEON 2301、QUERYTRACEON 8780を介して非常に選択的に)4レベルのネストされたインラインTVFのクエリに適用します(最下部の1つだけが実際の作業を行い、上位レベルが結果を相関させる場合) EXISTSサブクエリを介して)マージに参加し、いくつかのLAZY SPOOLが実行時間を半分に短縮しました。


4

いいえ、できません。

クエリがどのように機能するかを理解することで、クエリを「オプティマイザーフレンドリー」にすることができます(複雑な獣で、徹底的に知る必要はありません)。時間が非常に重要な場合は、SQL Serverの動作を変更するのではなく、クエリを修正することをお勧めします。

たとえば、データ量とデータ分布の変化に応じて、クエリがO(n)よりも効率的にスケーリングを開始するタイミングを知りたい場合があります。

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