Consigliabilità dell'uso di STATISTICS_NORECOMPUTE


9

Di recente sono stato coinvolto nel mantenimento di una serie di database con alcuni interessanti problemi di indice. Uno di quelli che mi aggrava di più sono le differenze negli indici tra macchine di sviluppo, test, modello e produzione. Dato che le differenze rendono piuttosto difficile la sintonizzazione delle query, è uno dei miei primi progetti la sincronizzazione.

Mentre ho confrontato gli ambienti di test e di modello, ho notato che la maggior parte degli indici nell'ambiente di modello è STATISTICS_NORECOMPUTEimpostata su, ONmentre quelli nel test no. In tutti gli ambienti esiste un lavoro notturno che aggiorna le statistiche di tutti i database.

Non ho mai affrontato STATISTICS_NORECOMPUTEprima, quindi ecco le mie domande. Esistono delle migliori pratiche per gestire questa impostazione? Se sto eseguendo aggiornamenti statistici alla fine della giornata, è meglio attivare STATISTICS_NORECOMPUTEtutti gli ambienti su tutti gli indici? O c'è una buona ragione per non farlo?

EDIT: Ho trovato uno dei blog di Kimberly Tripp sull'argomento qui che sembra suggerire che STATISTICS_NORECOMPUTEdovrebbe essere usato con parsimonia nella migliore delle ipotesi. Ma sono ancora preoccupato di spegnerlo a livello globale. Qualcuno ha provato questo e cosa hanno vissuto?


Dovresti vedere questa applicazione per crederci. Alcune tabelle hanno dozzine di indici, alcune non ne hanno, altre hanno più duplicati. È un vero casino. Qualche linea guida generale da seguire? Qualche posto in cui posso leggere?
Kenneth Fisher,

1
Un buon caso sarebbe quello di utilizzare STATISTICS_NORECOMPUTE = ON e FILLFACTOR = 100 per le tabelle di ricerca di sola lettura che vengono modificate solo da DBA utilizzando uno script che esegue un INDICE REBUILD con FULLSCAN dopo le modifiche; quindi la tabella è in forma ottimale con statistiche ottimali e senza altre modifiche, non c'è motivo di considerare la possibilità di ricalcolare le statistiche o di lasciare spazio per ridurre le divisioni di pagina sulle modifiche future.
Password anti-debole

Risposte:


4

È davvero una cosa situazionale che vuoi guardare per tabella o per indice, e devi davvero scoprire cosa c'è in produzione prima di intraprendere qualsiasi azione. In caso di dubbi, utilizzare anche ciò che è in produzione negli altri ambienti, anche se ciò significa utilizzare un sacco di impostazioni pazze. Non puoi avere una buona idea di come si comporterà la produzione se le cose sono diverse nei test o negli sviluppatori.

Ad ogni modo, la raccomandazione generale di lasciare le statistiche di aggiornamento automatico attivate ( STATISTICS_NORECOMPUTE = OFFche è l'impostazione predefinita) è per motivi di sicurezza, perché se questa opzione è disattivata e nulla aggiorna manualmente le statistiche, il risultato potrebbe essere piani di esecuzione davvero orrendi che non cambiano mai dopo che sono stati creati per la prima volta (e non vengono invalidati per altri motivi in ​​seguito).

Hai detto che le statistiche di aggiornamento automatico sono disattivate per la maggior parte degli indici (penso di averlo letto male inizialmente come tutti , non la maggior parte ). Per gli indici con le statistiche di aggiornamento automatico ancora abilitate, questa impostazione ha senso data l'attività su quelle tabelle? Mi aspetto che si tratti di tabelle con attività più elevate. È possibile che sia stato necessario molto lavoro per capirlo, e potrebbe valere la pena mantenere (o considerare fortemente) tali impostazioni. Per lo meno, prendi nota di quali statistiche sono, perché tali informazioni potrebbero tornare utili lungo la strada.

Pensandoci di più, dirò che l'attuale strategia ha un senso. È meglio che lasciare le statistiche di aggiornamento automatico attive per tutto? Sembra che qualcuno la pensasse così, al punto che valeva la pena fare un semplice compromesso per avere un lavoro SQL Agent associato.

Se l'idea era di avere a disposizione nuove statistiche senza bloccare le query (come questa ), potresti prendere in considerazione la possibilità di riattivare l'aggiornamento automatico per tutto e quindi attivare AUTO_UPDATE_STATISTICS_ASYNCanche. Quindi probabilmente modifica la pianificazione del lavoro in modo che venga eseguita una volta alla settimana anziché ogni giorno, poiché desideri comunque aggiornare WITH FULLSCANperiodicamente le statistiche .

Potrei semplicemente lasciarlo, però, poiché probabilmente hai pesci più grandi da friggere se gli indici stessi sono diversi tra gli ambienti e le ricostruzioni delle statistiche non sono troppo dolorose. Quello che c'è ora ha senso; devi solo rendere le cose coerenti in tutti gli ambienti. Probabilmente è leggermente migliore delle impostazioni più semplici che ho suggerito, a scapito di più lavoro. Ma scopri cosa c'è in produzione, tende ad usarlo e passa a cose più importanti; riesaminalo quando sei sul punto di aver bisogno di ottimizzare le prestazioni: le migliori statistiche al mondo non salveranno una query in cui manca un indice critico.


oops ... pensavo di aver scelto di non inviare questo commento.
cambio
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.