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.