Metodi per trovare nuove bandiere di traccia in SQL Server


38

Ci sono un sacco di bandiere traccia là fuori. Alcuni sono ben documentati, altri no, e altri hanno trovato la loro strada verso lo stato di comportamento predefinito nella versione 2016. A parte i canali di supporto ufficiali, i dipendenti Microsoft, ecc., Quali sono i modi per trovare nuovi flag di traccia?

Ho letto un paio di post recenti di Aaron Bertrand qui e qui , ma non ho notato nulla sulle nuove bandiere Trace.

Ho copiato i dati e il file di registro di mssqlsystemresource in una nuova posizione e li ho collegati come un normale database per sfogliare le tabelle e le viste di sistema, ma non ho individuato nulla immediatamente. Ho considerato di prendere un elenco di bandiere di traccia note e di scorrere i numeri non in quella lista, per vedere quali DBCC TRACEON avrebbe consentito, ma volevo porre prima la domanda qui.

Supponendo che il comando DBCC per abilitarli debba effettuare il check-in con alcune risorse per assicurarsi che il flag di traccia sia valido, dove arriva? Esiste un file DLL o qualche altro file di sistema che contiene un elenco?

So che la domanda getta una vasta rete, ma ciò che ha stimolato la lettura di una Trace Flag con un comportamento specifico previsto insieme a una nuova funzionalità nel 2016 che non stava avendo l'effetto descritto. Il mio pensiero iniziale era che forse i numeri venivano trasposti in qualche modo, come il 7129 che diventava 7219. Speravo di ottenere un elenco di flag di traccia validi all'interno di un intervallo, diciamo 7000-7999, per cercare permutazioni. Testarli tutti, sia come flag DBCC TRACEON che come parametri di avvio, sarebbe piuttosto fastidioso, combinato con testare i risultati rispetto al comportamento della funzione.

Risposte:


42

Non c'è niente che tu possa fare per trovare la lista se non chiedere o prenderli dai post / mazzi di diapositive / ecc. L'elenco esiste solo nel codice, in un file di intestazione in cui i numeri di flag di traccia validi sono associati ai nomi in un grande enum nel codice C ++ e quindi i nomi vengono utilizzati nel resto del codice.

Come ha detto Aaron, è possibile abilitare qualsiasi numero di flag di traccia e, se non fa nulla o non si esercita la funzionalità per cui è rilevante la bandiera di traccia, non si noterà alcuna differenza nel comportamento.

DBCC TRACEON non controlla nulla - poiché non esiste un elenco di runtime di quali numeri sono validi o meno - abilita solo quel numero di flag di traccia in una bitmap di quali flag sono impostati per quella connessione / a livello globale.

Il problema con un controllo di validità è che espone quali flag di traccia sono validi, consentendo loro di essere scoperti. In questo modo l '"elenco valido" viene effettivamente offuscato, che è ciò che vuole il team SQL.

Per quanto riguarda il suggerimento di Kin in un commento che SQL Server dovrebbe avere select * from sys.available_trace_flags- Sì e no. Esistono molti flag di traccia che sono altamente dannosi per le prestazioni e sono necessari solo per problemi di debug sotto la guida del supporto del prodotto, ma SQL Server potrebbe elencare i flag "sicuri".


2
Una piccola modifica: DBCC TRACEON controlla davvero qualcosa. Questa sintesi mostra il codice che scorre attraverso i flag di traccia a partire da 1. Tutte le versioni correnti di SQL Server verranno interrotte e genererà un errore al numero massimo di flag di traccia corrente: gist.github.com/BrentOzar/0e9692da8ceffeb2b4bdd064e36d3174
Brent Ozar

41

Quali sono i modi per trovare nuovi flag di traccia?

Per lo più, si tratta di avere il tempo e le risorse emotive da spendere per cercarli.

Certamente, è possibile scrivere uno script per scorrere i possibili numeri di flag di traccia e analizzare gli effetti, ma questo non è sempre fruttuoso. Ci sono molte ragioni per questo, ma le frustrazioni comuni includono il fatto che alcuni flag di traccia sono efficaci solo in combinazione con altri, alcuni funzionano solo -Tall'avvio, o se usati con DBCC TRACEON, alcuni solo con OPTION (QUERYTRACEON). Alcuni richiedono comandi non documentati o estensioni di comando o per abilitare anche una particolare funzione. Alcuni producono effetti solo se sai dove cercarli. E così via e ... molto ... così via.

Detto questo, forse la tecnica più efficace è quella di passare attraverso l'esecuzione di una particolare query o comando passo dopo passo con un debugger o altro strumento di profilazione collegato, confrontando i percorsi intrapresi con i flag di traccia on e off. Se questo richiede molto tempo, è perché lo è.

Per me, qualcosa deve essere potenzialmente molto interessante o correlarsi a un problema del mondo reale senza una soluzione migliore per me, anche solo per pensare di affrontarlo. È anche utile se hai già svolto questo processo centinaia o migliaia di volte prima, per avere un'idea generale del tipo di cosa che stai cercando, quale intervallo di flag di traccia è più probabile che sia efficace e quale parte della base di codice sarà interessante.

Attivare un breakpoint CSessionTraceFlags::CheckSessionTraceInternale verificare il valore del edxregistro (per vedere quale flag di traccia viene verificato) può essere utile in casi semplici, ma i casi interessanti non sono spesso semplici - e non tutti i flag di traccia vengono controllati nel punto in cui influisce sul percorso del codice preso.

C'è un elenco piuttosto piccolo di flag di traccia ufficiali . Questi sono i flag che sono stati completamente testati e sono (e saranno) supportati dai CSS e, in definitiva, dagli sviluppatori del prodotto. Sono anche bandiere con un caso d'uso abbastanza comune per cui vale la pena documentare.

Qualsiasi altro flag di traccia che trovi è una curiosità che potrebbe avere effetti inaspettati in varie situazioni (build, SKU, impostazioni di sicurezza, funzionalità diverse ... qualsiasi altra cosa tu possa o non riesca a pensare). Questi saranno 'supportati' solo dalla persona che ha scritto su di loro, se non del tutto.

Esistono diverse liste non ufficiali, la migliore che io conosca è Una raccolta tematica di bandiere SQL Server di Aaron Morelli (attualmente alla v6, aprile 2016).

Detto questo, Microsoft CSS (alla fine) ha accesso a tutti i flag di traccia, quindi potrebbero essere in grado di consigliarti su qualsiasi cosa tu incontri, anche se non sono nell'elenco ufficiale. Potrebbero scegliere di non dire nulla, ovviamente, e potrebbe esserci una commissione; Davvero non lo so, non ho mai seguito quella strada da solo.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.