Trace Flag 4199 - Global aktivieren?

19

Dies kann unter die Kategorie der Meinung fallen, aber ich bin neugierig, ob Leute Ablaufverfolgungsflag 4199 als Startparameter für SQL Server verwenden. Unter welchen Umständen ist bei denjenigen, die es verwendet haben, eine Abfrageregression aufgetreten?

Es scheint auf ganzer Linie ein potenzieller Leistungsvorteil zu sein. Ich denke darüber nach, es global in unserer Nicht-Produktionsumgebung zu aktivieren und es ein paar Monate ruhen zu lassen, um Probleme zu klären.

Werden die Fixes in 4199 standardmäßig in 2014 (oder 2016) in das Optimierungsprogramm übernommen? Ich verstehe zwar, dass es keine unerwarteten Planänderungen gibt, aber es ist seltsam, all diese Korrekturen zwischen den Versionen zu verbergen.

Wir verwenden 2008, 2008R2 und hauptsächlich 2012.

FilamentUnities
quelle
Haben Sie derzeit Probleme mit der Schätzung der Kardinalität oder etwas anderes?
Zane
Haben Sie die durch die Flagge aktivierten Änderungen gelesen, um festzustellen, ob sie für Sie von Nutzen sind?
Swasheck
Ich habe sie durchgelesen, einige scheinen relevant zu sein, insbesondere mehrspaltige Verknüpfungen.
FilamentUnities

Antworten:

20

Persönlich aktiviere ich TF4199 immer global, wenn ich einen neuen Server für ein neues Projekt baue. Das gleiche gilt, wenn ich vorhandene Instanzen auf neuere Versionen aktualisiere.

Der TF ermöglicht neue Korrekturen, die sich auf das Verhalten der Anwendung auswirken. Bei neuen Projekten ist das Risiko einer Regression jedoch kein Problem. Für Instanzen, die von früheren Versionen aktualisiert wurden, sind die Unterschiede zwischen der alten und der neuen Version ein Problem für sich und es wird erwartet, dass man sich mit der Planregression auseinandersetzen muss. Ich bevorzuge es daher, mit aktiviertem TF4199 zu kämpfen.

In Bezug auf vorhandene Datenbanken gibt es nur einen Weg, es zu testen. Sie können eine Auslastung des vorhandenen Setups erfassen und nach dem Aktivieren des Flags erneut abspielen. Mithilfe von RML-Dienstprogrammen können Sie den Prozess wie in dieser Antwort beschrieben automatisieren .

Offensichtlich wirkt sich das Flag auf die gesamte Instanz aus, sodass Sie alle dort befindlichen Datenbanken testen müssen.

Spaghettidba
quelle
12
Beachten Sie auch, dass in SQL Server 2016 (ohne das Ablaufverfolgungsflag) alle bisherigen 4199-Updates aktiviert werden. 4199 funktioniert weiterhin, ermöglicht jedoch erst ab diesem Zeitpunkt neue Korrekturen.
Aaron Bertrand
6

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.

Greg
quelle
1

Ich wollte meine Erfahrungen mit trace flag 4199 teilen.

Ich habe gerade ein Leistungsproblem auf einem Kundensystem mit SQL Server 2012 SP3 diagnostiziert. Der Kunde hat eine Berichtsdatenbank von seinem OLTP-Produktionsserver auf einen neuen Server verschoben. Ziel des Kunden war es, den Wettbewerb um Ressourcen mit den OLTP-Abfragen zu beseitigen. Leider sagte der Kunde, der neue Berichtsserver sei sehr langsam.

Eine Beispielabfrage auf dem OLTP-System wurde in 1,6 Sekunden ausgeführt. Der Abfrageplan führte eine Indexsuche für eine Tabelle mit ~ 200 Millionen Zeilen durch, die Teil einer Ansicht war.

Auf dem neuen Server wurde dieselbe Abfrage in 10 Minuten und 44 Sekunden ausgeführt. Es wurde ein Index-Scan für dieselbe Tabelle mit ~ 200 Millionen Zeilen durchgeführt.

Die Berichtsserverdaten waren eine Kopie der OLTP-Daten, sodass es sich anscheinend nicht um Datenunterschiede handelte.

Ich war ratlos, bis ich mich erinnerte, dass unsere Software (die ihr OLTP-System ausführt) einige Ablaufverfolgungsflags beim Start aktiviert hatte. Einer von ihnen, 4199, erinnerte ich mich, war ein Query Optimizer Fix.

Ich habe die Aktivierung des Ablaufverfolgungsflags 4199 auf dem neuen Berichtsserver des Kunden getestet und die Berichtsabfrage wurde in 0,6 Sekunden abgeschlossen. (Wow!) Ich habe das Ablaufverfolgungsflag deaktiviert und die Abfrage wurde in 10 Minuten und 44 Sekunden abgeschlossen. Aktiviert die Flagge: zurück zu 0,6 Sekunden. Anscheinend hat das Aktivieren des Ablaufverfolgungsflags dem Optimierer die Verwendung einer Indexsuche in der Ansicht der 200-Millionen-Zeilentabelle ermöglicht.

In diesem Fall haben die durch das Ablaufverfolgungsflag 4199 aktivierten Abfrageoptimierungen einen enormen Unterschied bewirkt. Ihre Erfahrungen können variieren. Aufgrund dieser Erfahrung scheint es mir jedoch definitiv wert zu sein, es zu ermöglichen.

Paul Williams
quelle