Methoden zum Suchen neuer Ablaufverfolgungsflags in SQL Server

38

Es gibt viele Trace Flags da draußen. Einige sind gut dokumentiert, andere nicht, und andere haben ihren Weg zum Standardverhaltensstatus in der Version 2016 gefunden. Welche Möglichkeiten gibt es, um neue Ablaufverfolgungsflags zu finden, abgesehen von offiziellen Supportkanälen, Microsoft-Mitarbeitern usw.?

Ich habe hier und hier ein paar kürzlich veröffentlichte Beiträge von Aaron Bertrand gelesen , aber nichts über neue Trace Flags entdeckt.

Ich habe die Daten- und Protokolldatei von mssqlsystemresource an einen neuen Speicherort kopiert und wie eine reguläre Datenbank angehängt, um Systemtabellen und -ansichten zu durchsuchen, aber nichts sofort erkannt. Ich überlegte, eine Liste bekannter Ablaufverfolgungsflags zu erstellen und die Nummern zu durchlaufen, die nicht in dieser Liste enthalten sind, um zu sehen, welche DBCC TRACEON zulässt, wollte aber zuerst die Frage stellen.

Angenommen, der DBCC-Befehl zum Aktivieren muss bei einer Ressource einchecken, um sicherzustellen, dass das Ablaufverfolgungsflag gültig ist. An wen wendet er sich? Gibt es eine DLL oder eine andere Systemdatei, die eine Liste enthält?

Ich weiß, dass die Frage ein breites Netz wirft, aber was dies anspornte, war das Lesen einer Ablaufverfolgungsflagge mit einem bestimmten beabsichtigten Verhalten neben einer neuen Funktion im Jahr 2016, die nicht den beschriebenen Effekt hatte. Mein erster Gedanke war, dass die Zahlen vielleicht irgendwie transponiert wurden, wie 7129 zu 7219. Ich hatte gehofft, eine Liste gültiger Ablaufverfolgungsflags innerhalb eines Bereichs zu erhalten, beispielsweise 7000-7999, um nach Permutationen zu suchen. Das Testen von allen, sowohl als DBCC-TRACEON-Flags als auch als Startparameter, wäre ein ziemliches Ärgernis, wenn die Ergebnisse mit dem Feature-Verhalten verglichen würden.

Erik Darling
quelle

Antworten:

42

Es gibt nichts, was Sie tun können, um die Liste zu finden, außer nachzufragen oder sie von Posts / Slide Decks / etc. Abzuholen. Die Liste ist nur im Code in einer Headerdatei vorhanden, in der die gültigen Ablaufverfolgungskennzeichennummern den Namen in einer großen Aufzählung im C ++ - Code zugeordnet sind, und die Namen dann im restlichen Code verwendet werden.

Wie Aaron sagte, können Sie jede Trace-Flag-Nummer aktivieren, und wenn sie nichts bewirkt oder die Funktionalität, für die das Trace-Flag relevant ist, nicht ausübt, werden Sie keinen Unterschied im Verhalten bemerken.

DBCC TRACEON prüft nichts - da es keine Laufzeitliste gibt, welche Nummern gültig sind oder nicht - aktiviert es nur diese Ablaufverfolgungsflagnummer in einer Bitmap, welche Flags für diese Verbindung / global gesetzt sind.

Das Problem bei einer Gültigkeitsprüfung besteht darin, dass offengelegt wird, welche Ablaufverfolgungsflags gültig sind, damit sie erkannt werden können. Auf diese Weise wird die 'gültige Liste' effektiv verschleiert, was das SQL-Team wünscht.

In Bezug auf Kins Vorschlag in einem Kommentar, den SQL Server haben sollte select * from sys.available_trace_flags- Ja und Nein. Es gibt viele Ablaufverfolgungsflags, die die Leistung stark beeinträchtigen und nur zum Debuggen von Problemen unter Anleitung des Produktsupports erforderlich sind. SQL Server kann jedoch die "sicheren" Flags auflisten.

Paul S. Randal
quelle
2
Eine kleine Änderung - DBCC TRACEON überprüft tatsächlich etwas. Diese Übersicht zeigt Code, der die Ablaufverfolgungsflags ab 1 durchläuft. Alle aktuellen Versionen von SQL Server lösen einen Fehler bei der maximalen aktuellen Ablaufverfolgungsflag-Nummer aus: gist.github.com/BrentOzar/0e9692da8ceffeb2b4bdd064e36d3174
Brent Ozar
41

Wie finde ich neue Trace-Flags?

Zum größten Teil kommt es darauf an, die Zeit und die emotionalen Ressourcen zu haben, um danach zu suchen.

Natürlich ist es möglich, ein Skript zu schreiben, um mögliche Trace-Flag-Nummern zu durchlaufen und die Auswirkungen zu analysieren, aber dies ist nicht immer fruchtbar. Es gibt viele Gründe dafür, aber häufig sind Frustrationen die Folge, dass einige Ablaufverfolgungsflags nur in Kombination mit anderen wirksam sind, manche nur -Tbeim Start oder bei Verwendung mit DBCC TRACEON, manche nur mit OPTION (QUERYTRACEON). Einige erfordern undokumentierte Befehle oder Befehlserweiterungen oder die Aktivierung einer bestimmten Funktion. Einige erzeugen nur dann Effekte, wenn Sie wissen, wo Sie nach diesen Effekten suchen müssen. Und so weiter und ... sehr ... so weiter.

Das heißt, die vielleicht effektivste Technik besteht darin, die Ausführung einer bestimmten Abfrage oder eines bestimmten Befehls Schritt für Schritt mit einem angehängten Debugger oder einem anderen Profilerstellungs-Tool durchzuführen und die Pfade zu vergleichen, die mit dem (den) eingeschalteten und ausgeschalteten Trace-Flag (s) genommen wurden. Wenn das zeitaufwändig klingt, dann ist es so.

Für mich muss etwas potenziell sehr interessant sein oder sich auf ein reales Problem beziehen, ohne dass ich eine bessere Lösung finden kann, um überhaupt darüber nachzudenken, wie ich es angehen soll. Es ist auch hilfreich, wenn Sie diesen Prozess bereits hunderte oder tausende Male durchlaufen haben, um ein umfassendes Gefühl dafür zu bekommen, welche Art von Ablaufverfolgungsflags am wahrscheinlichsten wirksam sind und welcher Teil der Codebasis wird interessant sein.

Festlegen eines Haltepunkts CSessionTraceFlags::CheckSessionTraceInternalund Überprüfen des Werts vonedx Registers (um zu sehen, welches Ablaufverfolgungsflag geprüft wird) kann in einfachen Fällen nützlich sein, aber die interessanten Fälle sind oft nicht einfach - und nicht alle Ablaufverfolgungsflags werden an dem Punkt geprüft, an dem sie geprüft werden den eingeschlagenen Codepfad beeinflussen.

Es gibt eine relativ kleine Liste offizieller Trace-Flags . Dies sind die Flags, die vollständig getestet wurden und von CSS und letztendlich den Produktentwicklern unterstützt werden. Sie sind auch Flags mit einem Anwendungsfall, der es wert ist, dokumentiert zu werden.

Jedes andere Trace-Flag, das Sie finden, ist eine Kuriosität, die in verschiedenen Situationen unerwartete Auswirkungen haben kann (verschiedene Builds, SKUs, Sicherheitseinstellungen, verschiedene Funktionen ... alles, was Ihnen sonst noch einfällt oder nicht einfällt). Diese werden, wenn überhaupt, nur von der Person "unterstützt", die darüber geschrieben hat.

Es gibt mehrere inoffizielle Listen. Die beste, die ich kenne, ist eine aktuelle Sammlung von SQL Server-Flags von Aaron Morelli (derzeit Version 6, April 2016).

Alles in allem hat Microsoft CSS (letztendlich) Zugriff auf alle Ablaufverfolgungsflags, sodass sie Sie möglicherweise über alle Probleme informieren können, auch wenn sie nicht auf der offiziellen Liste stehen. Natürlich können sie sich dafür entscheiden, nichts zu sagen, und es kann eine Gebühr anfallen. Ich weiß es wirklich nicht, ich bin diesen Weg nie selbst gegangen.

Paul White sagt GoFundMonica
quelle