Meine Suche nach dem Thema hat mich hierher geführt, daher möchte ich nur meine jüngsten Erfahrungen zu diesem Thema mitteilen.
Ich habe SQL 2014 ausgeführt, also habe ich mir gedacht, dass ich sicher sein kann, dass ich mich ein bisschen um 4199 kümmern muss ... aber es stimmte einfach nicht ...
So diagnostizieren Sie, ob Sie 4199 benötigen
Wenn Ihre Abfrage scheinbar schlecht ausgeführt wird , insbesondere wenn Sie dies nicht für erforderlich halten, versuchen Sie, das Folgende an das Ende der Abfrage anzuhängen, um zu überprüfen, ob alle Ihre Probleme behoben sind , da möglicherweise 4199 ("Alle Fehlerbehebungen für das Abfrageoptimierungsprogramm aktivieren ") erforderlich sind . )
SELECT SomeColumn
FROM SomeTable
OPTION(QUERYTRACEON 4199)
In meiner Situation hatte ich eine Top-10-Klausel, die eine Abfrage in die Luft jagte, ohne die alles in Ordnung war. Das ließ mich glauben, dass etwas faul war, und dass 4199 vielleicht helfen könnte.
Über 4199
Alle SQL Server Query Optimizer-Fehler- / Leistungskorrekturen, die nach der Veröffentlichung der neuen Hauptversion erstellt wurden, werden ausgeblendet und blockiert. Dies ist der Fall, wenn sie tatsächlich einem anderen theoretisch perfekt optimierten Programm schaden könnten. Installieren Sie Updates wie gewünscht. Die eigentlichen Änderungen am Abfrageoptimierer sind daher standardmäßig nicht aktiviert. Sobald eine einzelne Korrektur oder Verbesserung durchgeführt wurde, wird 4199 daher zu einer Notwendigkeit, wenn Sie diese nutzen möchten. Wie viele Fehlerbehebungen angezeigt werden, werden Sie feststellen, dass Sie diese Option aktivieren, wenn eine davon auf Sie zutrifft. Diese Fixes sind normalerweise an ihre eigenen Ablaufverfolgungsflags gebunden, aber 4199 wird als Master "Alle Fixes aktivieren" verwendet.
Wenn Sie wissen, welche Fixes Sie benötigen, können Sie diese als Teil der Mahlzeit aktivieren, anstatt 4199 zu verwenden. Wenn Sie alle Fixes aktivieren möchten, verwenden Sie 4199.
Ok, also du willst 4199 global ...
Erstellen Sie einfach einen SQL Agent-Job, der jeden Morgen mit der folgenden Zeile ausgeführt wird, um das Ablaufverfolgungsflag global zu aktivieren. Dies stellt sicher, dass sie wieder eingeschaltet werden, wenn sie von irgendjemandem ausgeschaltet werden. Dieser Job-Schritt hat ziemlich einfache SQL:
DBCC TRACEON (4199, -1);
Wobei -1 den globalen Teil in DBCC TRACEON angibt. Für weitere Informationen siehe:
https://msdn.microsoft.com/en-us/library/ms187329.aspx?f=255&MSPPError=-2147217396
Abfragepläne "neu kompilieren"
Bei meinem letzten Versuch musste ich 4199 global aktivieren und dann auch vorhandene zwischengespeicherte Abfragepläne entfernen :
sp_recompile 'dbo.SomeTable'
https://msdn.microsoft.com/en-us/library/ms181647.aspx?f=255&MSPPError=-2147217396
Wenn die gespeicherte Prozedur zum erneuten Kompilieren Abfragepläne für das Datenbankobjekt (z. B. eine Tabelle) findet und diese Abfragepläne löscht, muss beim nächsten Versuch eine ähnliche Abfrage ausgeführt werden, um sie zu kompilieren.
In meinem Fall verhinderte 4199, dass die fehlerhaften Abfragepläne erstellt wurden, aber ich musste auch diejenigen entfernen, die noch über sp_recompile zwischengespeichert wurden. Wählen Sie eine beliebige Tabelle aus der bekannten betroffenen Abfrage aus, und versuchen Sie diese Abfrage erneut, vorausgesetzt, Sie haben 4199 jetzt global aktiviert und den Plan für fehlerhafte zwischengespeicherte Abfragen gelöscht.
Abschließend zu 4199
Wenn Sie Indizes verwenden, ist eine Optimierung des intelligenten Abfrageplans wichtig, um diese Indizes tatsächlich intelligent zu verwenden. Unter der Annahme, dass mit der Zeit einige Korrekturen für den Abfrageoptimierungsprozess veröffentlicht werden, können Sie im Allgemeinen mit 4199, die global aktiviert sind, problemlos ausgeführt werden. Solange Sie feststellen, dass einige neue Fixes möglicherweise nicht so gut mit einer hochoptimierten Datenbank funktionieren, die in der vorherigen Umgebung vor dem Fix so optimiert war. Aber was macht 4199? Es werden nur alle Korrekturen aktiviert.