Les indicateurs de trace

Une petite compilation des indicateurs de trace (traceflags).

Après un sondage informel qui a fait le tour de notre petite communauté d’experts SQL Server, je compile ici la liste des traceflag que nos collègues ont trouvé les plus utiles (ou qu’ils utilisent le plus souvent) dans SQL Server, plus quelques ajouts de mon cru.


Pour rappel, un traceflag, ou en français "indicateur de trace" ou "drapeau de trace" est un paramètre transmis au serveur SQL, permettant de configurer un comportement particulier, comme par exemple le renvoi d’indications de diagnostic ou une modification du comportement de l’optimiseur.

Les indicateurs de trace se configurent :

  • Soit comme paramètre de démarrage du serveur, activé globalement à l’aide de l’option de ligne de commande –T  (se configure via le gestionnaire de configuration SQL Server)
  • Soit dans la session utilisateur avec la commande DBCC TRACEON, activé pour la session, ou si le deuxième argument de cette commande est passé à -1 pour toute l’instance.
  • Soit pour une requête individuel avec l’indicateur QUERYTRACEON


Allons- y de notre petite liste.

Avant d’activer un traceflag en production, il faut savoir ce que vous faites ! Une bonne partie des indicateurs existants ne sont pas officiellement documentés : leur utilisation reste entièrement à vos risques et périls et doit être réservée à des environnements de test ! La liste des traceflags documentés : https://technet.microsoft.com/en-us/library/ms188396.aspx 

  • 1117 : force l’ensemble des fichiers à s’agrandir simultanément lors d’un incrément de croissance. Etendue globale. Avec SQL Server 2016 ce paramètre est activé par défaut pour la base tempdb, et peut être configuré base par base et pour chaque filegroup avec la commande ALTER DATABASE MODIFY FILEGROUP AUTOGROWTH_ALL_FILES | AUTOGROWTH_SINGLE_FILE.
  • 1118 : SQL Server stocke les 8 premières pages d’une même table dans des extensions mixtes. Pour réduire la contention sur les pages d’allocation SGAM, ce TF force l’allocation uniquement dans des extensions uniformes. Etendue globale. KB : https://support.microsoft.com/en-us/kb/328551. Dans SQL 2016, ce TF est activé par défaut pour toutes les bases de données et se configure avec la commande ALTER DATABASE SET MIXED_PAGE_ALLOCATION
  • 3226 : Empêche SQL Serveur d’écrire un message dans l’errorlog en cas de sauvegarde réussie. Bien utile en cas de sauvegardes fréquentes qui polluent le journal d’erreurs. Etendue globale.
  • 2371 : modifie l’algorithme de recalcul automatique des statistiques de colonnes et d’index. Le seuil est dynamique en fonction de la taille de la table. Fonctionnement par défaut avec SQL 2016. Etendue globale.
  • 3604 : Permet d’afficher les résultats de certaines commandes (comme DBCC PAGE ou DBCC IND) dans la fenêtre de messages. Le TF 3605 force l’envoi vers l’errorlog.
  • 4199 : active les hotfixes de l’optimiseur inactivés (destinés à être activés dans une version future). Lire https://support.microsoft.com/en-us/kb/974006 . Dans SQL 2016, il peut être configuré avec la commande ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES
  • 9481 : utilisable pour une base en compatibilité 2014 ou 2016, force l’estimateur de cardinalité à fonctionner sur le modèle de SQL 2012. Etendue globale, session ou requête.
  • 2312 : à l’inverse du précédent, utilisable pour une base en compatibilité 2012 ou inférieure (sur un serveur 2014 ou 2016), force l’estimateur de cardinalité à fonctionner sur le modèle de SQL 2014/2016. Etendue globale, session ou requête.
  • 1204 et 1222 : affichent les informations sur les deadlocks dans l’errorlog. 1204 donne l’information par nœud, 1222 par process et ressource en XML. Couramment utilisés.
  • 1200 : uniquement pour des fins de démonstration, car extrêmement verbeux, il affiche chaque verrou posé. A utiliser globalemment avec le TF 3604
  • 1224 et 1211 : désactivent l’escalade de verrous. Le TF 1211 force la désactivation jusqu’à épuisement de la mémoire…