Trace Flag 4199 - Abilitare a livello globale?


19

Questo potrebbe rientrare nella categoria di opinione, ma sono curioso di sapere se le persone utilizzano il flag di traccia 4199 come parametro di avvio per SQL Server. Per quelli che l'hanno usato, in quali circostanze hai riscontrato la regressione della query?

Sembra certamente un potenziale vantaggio in termini di prestazioni su tutta la linea, sto pensando di abilitarlo a livello globale nel nostro ambiente di non produzione e lasciarlo riposare per un paio di mesi per risolvere eventuali problemi.

Le correzioni del 4199 sono state integrate nell'ottimizzatore per impostazione predefinita nel 2014 (o 2016)? Anche se capisco il caso di non introdurre modifiche impreviste al piano, sembra strano mantenere nascoste tutte queste correzioni tra le versioni.

Stiamo utilizzando 2008, 2008R2 e principalmente 2012.


Stai riscontrando problemi con la stima della cardinalità o qualcosa del genere?
Zane,

Hai letto le modifiche abilitate dalla bandiera per vedere se ti potrebbero essere utili?
swasheck,

Li ho letti, molti sembrano rilevanti, in particolare i join multi-colonna.
FilamentUnities

Risposte:


20

Personalmente, ogni volta che costruisco un nuovo server per un nuovo progetto, abilito sempre TF4199 a livello globale. Lo stesso vale quando aggiorno istanze esistenti a versioni più recenti.

Il TF abilita nuove correzioni che potrebbero influenzare il comportamento dell'applicazione, ma per i nuovi progetti il ​​rischio di regressione non è un problema. Per le istanze aggiornate dalle versioni precedenti, le differenze tra la vecchia e la nuova versione sono di per sé un problema e dovremo comunque affrontare la regressione pianificata, quindi preferisco combattere con TF4199 abilitato.

Per quanto riguarda i database esistenti, c'è solo un modo per saperlo: testarlo. È possibile acquisire un carico di lavoro sull'impostazione esistente e riprodurlo dopo aver abilitato il flag. Le utility RML possono aiutarti ad automatizzare il processo, come descritto in questa risposta .

Ovviamente, il flag influenza l'intera istanza, quindi dovrai testare tutti i database che si trovano lì.


12
È anche importante notare che tutte le 4199 correzioni ad oggi verranno attivate in SQL Server 2016 (senza il flag di traccia). 4199 continuerà a funzionare, ma consentirà solo nuove correzioni da quel momento in poi.
Aaron Bertrand

6

La mia ricerca sull'argomento mi ha portato qui, quindi vorrei solo condividere la mia recente esperienza sull'argomento.

Stavo eseguendo SQL 2014, quindi ho pensato che sarei stato al sicuro dal dovermi preoccupare per un po 'di 4199 ... ma non era vero ...

Come diagnosticare se hai bisogno di 4199

Se la tua query sembra funzionare male , in particolare quando ritieni che non dovrebbe, prova anche ad aggiungere quanto segue alla fine per vedere se risolve tutti i tuoi problemi, poiché potresti aver bisogno di 4199 ("Abilita tutte le correzioni dello Strumento per ottimizzare le query". )

SELECT SomeColumn
FROM SomeTable    
OPTION(QUERYTRACEON 4199)

Nella mia situazione, avevo una clausola tra le prime 10 che esplodeva una query che andava bene senza, il che è ciò che mi ha fatto pensare che stesse succedendo qualcosa di sospetto, e che 4199 potrebbe essere d'aiuto.

4199 circa

Eventuali correzioni di errori / prestazioni dello Strumento per ottimizzare la query di SQL Server create dopo la nuova versione principale vengono effettivamente nascoste e bloccate. Questo nel caso in cui potrebbero effettivamente danneggiare qualche altro programma teoricamente perfettamente ottimizzato. Quindi, installa gli aggiornamenti come potresti, le modifiche effettive di Query Optimizer non sono abilitate per impostazione predefinita. Pertanto, una volta effettuata una singola correzione o miglioramento, 4199 diventa una necessità se si desidera trarne vantaggio. Come vengono visualizzate molte correzioni, alla fine ti ritroverai ad accenderlo quando una di esse ti colpisce. Queste correzioni sono generalmente legate ai loro flag di traccia, ma 4199 viene utilizzato come master "Attiva ogni correzione".

Se sai di quali correzioni hai bisogno, puoi abilitarle a pasto invece di usare 4199. Se vuoi abilitare tutte le correzioni, usa 4199.

Ok, quindi vuoi 4199 a livello globale ...

Basta creare un processo agente SQL che viene eseguito ogni mattina con la seguente riga per abilitare il flag di traccia a livello globale. In questo modo, se qualcuno li ha disattivati ​​o ecc, che vengono riattivati. Questo passaggio di lavoro ha sql piuttosto semplice:

DBCC TRACEON (4199, -1);

Dove -1 specifica la parte globale in DBCC TRACEON. Per maggiori informazioni vedi:

https://msdn.microsoft.com/en-us/library/ms187329.aspx?f=255&MSPPError=-2147217396

Piani di query "Ricompilazione"

Nel mio tentativo più recente ho dovuto abilitare 4199 a livello globale e quindi rimuovere anche i piani di query memorizzati nella cache :

sp_recompile 'dbo.SomeTable'

https://msdn.microsoft.com/en-us/library/ms181647.aspx?f=255&MSPPError=-2147217396

Laddove la procedura memorizzata di ricompilazione trova piani di query relativi all'oggetto database (come una tabella) ed elimina tali piani di query, è necessario il tentativo successivo di eseguire una query simile per compilarli.

Quindi, nel mio caso 4199 ha impedito la creazione dei piani di query errati, ma ho anche dovuto rimuovere quelli che erano ancora memorizzati nella cache tramite sp_recompile. Scegli qualsiasi tabella dalla query nota interessata e dovresti essere bravo a riprovare quella query, supponendo che ora hai abilitato 4199 a livello globale e cancellato il piano di query memorizzato nella cache.

In conclusione il 4199

Man mano che utilizzi gli indici, un'ottimizzazione del piano di query intelligente diventa importante per utilizzare effettivamente quegli indici in modo intelligente e supponendo che nel tempo verrà rilasciata una correzione al processo di ottimizzazione della query, in genere sei in acqua sicura per eseguire solo con 4199 abilitato a livello globale, fino a quando ti rendi conto che alcune nuove correzioni potrebbero non funzionare in modo altrettanto efficace con un database altamente ottimizzato che era così ottimizzato nell'ambiente precedente prima di detta correzione. Ma cosa fa 4199? Abilita solo tutte le correzioni.


1

Volevo condividere la mia esperienza con trace flag 4199.

Ho appena finito di diagnosticare un problema di prestazioni su un sistema cliente che esegue SQL Server 2012 SP3. Il cliente stava spostando un database di report dal proprio server OLTP di produzione su un nuovo server. L'obiettivo del cliente era rimuovere la concorrenza per le risorse con le query OLTP. Sfortunatamente, il cliente ha affermato che il nuovo server di report era molto lento.

Una query di esempio eseguita sul sistema OLTP è stata completata in 1,6 secondi. Il piano di query ha cercato un indice su una tabella di circa 200 milioni di righe che faceva parte di una vista.

Sul nuovo server, la stessa query è stata completata in 10 minuti e 44 secondi. Ha eseguito una scansione dell'indice sulla stessa tabella ~ 200 milioni di righe.

I dati del server di report erano una copia dei dati OLTP, quindi non sembravano essere una differenza nei dati.

Sono rimasto perplesso finché non ho ricordato che il nostro software (che esegue il loro sistema OLTP) ha abilitato alcuni flag di traccia all'avvio. Uno di loro, 4199, ho ricordato era una correzione di Query Optimizer.

Ho testato l'abilitazione del flag di traccia 4199 sul nuovo server di report del cliente e la query di report è stata completata in 0,6 secondi. (Caspita!) Ho disabilitato il flag di traccia e la query è tornata al completamento in 10 min 44 sec. Abilitato il flag: torna a 0,6 secondi. Apparentemente, l'abilitazione del flag di traccia ha consentito all'ottimizzatore di utilizzare una ricerca indice nella vista sulla tabella di 200 milioni di righe.

In questo caso, le ottimizzazioni delle query abilitate dal flag di traccia 4199 hanno fatto un'enorme differenza. Le tue esperienze possono variare. Tuttavia, sulla base di questa esperienza, mi sembra sicuramente valsa la pena abilitarmi.

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.