Méthodes de recherche de nouveaux indicateurs de trace dans SQL Server

38

Il y a beaucoup de drapeaux de trace là-bas. Certaines sont bien documentées, d'autres pas, et d'autres ont retrouvé leur statut de comportement par défaut dans la version 2016. Outre les canaux de support officiels, les employés de Microsoft, etc., quels sont les moyens de trouver de nouveaux indicateurs de trace?

J'ai lu quelques articles récents d'Aaron Bertrand ici et ici , mais je n'ai rien trouvé à propos des nouveaux drapeaux Trace.

J'ai copié les données et le fichier journal de mssqlsystemresource vers un nouvel emplacement et les ai attachés comme une base de données classique pour parcourir les tables système et les vues, mais je n'ai rien repéré immédiatement. J'ai envisagé de prendre une liste de drapeaux de trace connus et de parcourir des nombres ne figurant pas sur cette liste pour voir ceux que DBCC TRACEON autoriserait, mais je voulais d'abord poser la question ici.

En supposant que la commande DBCC pour les activer doit vérifier avec une ressource pour s'assurer que l'indicateur de trace est valide, où va-t-il atteindre? Existe-t-il un fichier .dll ou un autre fichier système contenant une liste?

Je sais que la question couvre un large éventail de problèmes, mais ce qui l’a incité à lire concernait la lecture d’un indicateur de suivi avec le comportement voulu ainsi qu’un nouvel élément en 2016 qui n’avait pas l’effet décrit. Ma pensée initiale était que peut-être les chiffres ont-ils été transposés, comme 7129, devenant 7219. J'espérais obtenir une liste d'indicateurs de trace valides dans une plage, par exemple 7000-7999, afin de rechercher des permutations. Les tester tous, à la fois en tant qu'indicateurs DBCC TRACEON et en tant que paramètres de démarrage constituerait une gêne importante, combinée à la vérification des résultats par rapport au comportement de la fonction.

Erik Darling
la source

Réponses:

42

Il n'y a rien que vous puissiez faire pour trouver la liste sauf demander ou les récupérer à partir de messages / diapositives / etc. La liste n'existe que dans le code, dans un fichier d'en-tête où les numéros d'indicateur de trace valides sont mappés aux noms d'une grande énumération dans le code C ++, puis les noms sont utilisés dans le reste du code.

Comme Aaron l'a dit, vous pouvez activer n'importe quel numéro d'indicateur de trace. S'il ne fait rien ou si vous n'exercez pas les fonctionnalités pour lesquelles l'indicateur de trace est pertinent, vous ne remarquerez aucune différence de comportement.

DBCC TRACEON ne vérifie rien - comme il n'y a pas de liste au moment de l'exécution contenant des nombres valides ou non - il n'active que le numéro de l'indicateur de trace dans un bitmap indiquant quels indicateurs sont définis pour cette connexion / globalement.

Le problème avec un contrôle de validité est que cela exposerait les indicateurs de trace valides, leur permettant d'être découverts. De cette façon, la 'liste valide' est efficacement masquée, ce que souhaite l'équipe SQL.

En ce qui concerne la suggestion de Kin dans un commentaire que SQL Server devrait avoir select * from sys.available_trace_flags- Oui et non. De nombreux indicateurs de trace nuisent grandement aux performances et ne sont nécessaires que pour les problèmes de débogage, avec l'assistance du support produit, mais SQL Server peut répertorier les indicateurs "sûrs".

Paul S. Randal
la source
2
Un ajustement mineur - DBCC TRACEON vérifie effectivement quelque chose. Cette liste contient du code qui parcourt les indicateurs de trace à partir de 1. Toutes les versions actuelles de SQL Server s'affichent et génèrent une erreur au numéro d'indicateur de suivi
Brent Ozar
41

Quels sont les moyens de trouver de nouveaux indicateurs de trace?

Pour l'essentiel, il s'agit de disposer du temps et des ressources émotionnelles nécessaires pour les rechercher.

Certes, il est possible d'écrire un script pour parcourir les numéros d'indicateurs de trace possibles et analyser les effets, mais cela n'est pas toujours fructueux. Il y a de nombreuses raisons à cela, mais les frustrations courantes incluent le fait que certains indicateurs de trace ne sont efficaces qu'en combinaison, d'autres ne fonctionnent qu'avec-T démarrage, ou lorsqu’ils sont utilisés DBCC TRACEON, d’autres uniquement OPTION (QUERYTRACEON). Certaines nécessitent des commandes non documentées ou des extensions de commande, ou encore l'activation d'une fonctionnalité particulière. Certains produisent des effets uniquement si vous savez où chercher ces effets. Et ainsi de suite et… beaucoup … etc.

Cela dit, peut-être que la technique la plus efficace consiste à exécuter étape par étape l'exécution d'une requête ou d'une commande particulière avec un débogueur ou un autre outil de profilage associé, en comparant les chemins empruntés avec le ou les indicateurs de trace. Si cela semble prendre du temps, c'est parce que c'est le cas.

Pour moi, quelque chose doit être potentiellement très intéressant, ou avoir un rapport avec un problème du monde réel sans une meilleure solution pour moi, même penser à le résoudre. Il est également utile, si vous avez déjà suivi ce processus des centaines ou des milliers de fois auparavant, de vous faire une idée générale du type de chose que vous recherchez, de la gamme d'indicateurs de suivi la plus susceptible d'être efficace et de la partie la plus efficace. de la base de code va être intéressant.

Définir un point d'arrêt sur CSessionTraceFlags::CheckSessionTraceInternal et vérifier la valeur du edxregistre (pour voir quel indicateur de trace est vérifié) peut être utile dans des cas simples, mais les cas intéressants ne sont pas souvent simples - et tous les indicateurs de trace ne sont pas vérifiés au point où ils le sont. affecter le chemin de code pris.

Il y a une assez petite liste de drapeaux de trace officiels . Ce sont les drapeaux qui ont été entièrement testés et qui sont (et seront) supportés par CSS et, finalement, les développeurs de produits. Ce sont aussi des drapeaux avec un cas d’utilisation assez commun pour mériter d’être documentés.

Tout autre indicateur de trace trouvé est une curiosité qui peut avoir des effets inattendus dans différentes situations (versions différentes, unités de stockage, paramètres de sécurité, différentes fonctionnalités, tout ce que vous pouvez ou ne pouvez pas imaginer). Celles-ci ne seront «prises en charge» que par la personne qui les a écrites, voire pas du tout.

Il existe plusieurs listes non officielles, la meilleure que je connaisse est Une collection thématique de drapeaux SQL Server par Aaron Morelli (actuellement en version 6, avril 2016).

Cela dit, Microsoft CSS a (en fin de compte) accès à tous les indicateurs de trace. Il peut donc vous conseiller sur tous les incidents que vous rencontrez, même s'ils ne figurent pas sur la liste officielle. Ils peuvent choisir de ne rien dire, bien sûr, et des frais peuvent être exigés. Je ne sais vraiment pas, n'ayant jamais emprunté cette voie moi-même.

Paul White dit GoFundMonica
la source