トピックを検索してここに来たので、トピックに関する最近の経験を共有したいと思います。
私はSQL 2014を実行していたので、4199について少し気にする必要はないだろうと思っていました...しかし、それは真実ではありませんでした...
4199が必要かどうかを診断する方法
あなたの場合は、クエリが実行するように見えるの悪いあなたはそれが、それはすべてあなたの問題を修正する場合は、必要があるかもしれませんとしても、見ることの末尾に以下を追加してみてくださいべきではないと感じたときに、特に、4199を (「すべてのクエリオプティマイザの修正を有効にします。」)
SELECT SomeColumn
FROM SomeTable
OPTION(QUERYTRACEON 4199)
私の状況では、トップ10の節でクエリを爆破しましたが、これはうまく機能せず、問題が発生していると思い、4199が役立つ可能性がありました。
約4199
新しいメジャーバージョンリリースの後に作成されたSQL Server Query Optimizerのバグ/パフォーマンスの修正は、実際には非表示になりブロックされます。これは、理論的に完全に最適化された他のプログラムを実際に害する可能性がある場合です。したがって、更新プログラムをインストールするかもしれませんが、実際のクエリオプティマイザーの変更は既定では有効になっていません。したがって、1つの修正または機能拡張が行われた後、それを利用したい場合は4199が必要になります。多くの修正が表示されるので、そのうちの1つが影響を与えると、最終的にこれをオンにします。これらの修正は通常、独自のトレースフラグに関連付けられていますが、4199がマスターとして使用されます。「修正をすべて有効にする」。
必要な修正がわかっている場合は、4199を使用する代わりに、それらを個別に有効にすることができます。すべての修正を有効にする場合は、4199を使用します。
わかりましたので、グローバルに4199が必要です...
トレースフラグをグローバルに有効にするには、次の行で毎朝実行されるSQLエージェントジョブを作成するだけです。これにより、だれかがそれらをオフにした場合など、再びオンになります。このジョブステップには、非常に単純なsqlがあります。
DBCC TRACEON (4199, -1);
-1は、DBCC TRACEONのグローバル部分を指定します。詳細については、以下を参照してください。
https://msdn.microsoft.com/en-us/library/ms187329.aspx?f=255&MSPPError=-2147217396
クエリプランの「再コンパイル」
最近の試みでは、4199をグローバルに有効にし、既存のキャッシュされたクエリプランも削除する必要がありました。
sp_recompile 'dbo.SomeTable'
https://msdn.microsoft.com/en-us/library/ms181647.aspx?f=255&MSPPError=-2147217396
再コンパイルストアドプロシージャは、データベースオブジェクト(テーブルなど)に関連するクエリプランを見つけ、それらのクエリプランを削除するため、次回同様のクエリを実行してコンパイルする必要があります。
そのため、私の場合、4199は悪いクエリプランが作成されないようにしましたが、sp_recompileを介してキャッシュされたクエリプランも削除する必要がありました。影響を受ける既知のクエリから任意のテーブルを選択します。4199をグローバルに有効にし、問題のあるキャッシュクエリプランをクリアしたと仮定して、そのクエリを再試行してください。
4199の結論
インデックスを利用するとき、スマートクエリプランの最適化は、それらのインデックスを実際にインテリジェントに使用するために重要になります。また、クエリの最適化プロセスに対する何らかの修正がリリースされると仮定すると、通常、4199をグローバルに有効にして実行するだけで安全です修正前の以前の環境で最適化された高度に最適化されたデータベースでは、いくつかの新しい修正が実際にはうまく機能しない可能性があることを認識している限り。しかし、4199は何をしますか?すべての修正が有効になるだけです。