SQL Server ricreando piani ogni giorno


14

Abbiamo questo problema nel nostro ambiente di produzione.

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) - Enterprise Edition (64-bit) su Windows NT 6.1 (Build 7601: Service Pack 1).

SQL Server elimina tutti (quasi il 100%) dei vecchi piani di esecuzione e li ricrea ogni giorno dall'oggi al domani (dalle 23:00 alle 8:00 AM). Ciò accadeva anche quando le "statistiche di aggiornamento automatico" erano in stato disabilitato. Abbiamo attivato le "statistiche di aggiornamento automatico" nelle ultime 2-3 settimane. Ma sta ancora succedendo.

Non sappiamo davvero cosa scateni questa rigenerazione di piani, ma siamo sicuri di non farlo manualmente.

L'unica cosa che coincide davvero con la tempistica dei piani in fase di rigenerazione è un lavoro di manutenzione DB che abbiamo: la riorganizzazione dell'indice giornaliero (quando la frammentazione è del 5-30%) e la ricostruzione dell'indice giornaliero (quando la frammentazione è superiore al 30% ) lavoro. Di solito questo lavoro di manutenzione giornaliera si riorganizza (poiché la frammentazione dell'indice non supera mai il 30% su base giornaliera).

impatto:

Questi piani appena creati fanno sì che alcune chiamate UDF / chiamate di query (chiamate da UI / pagine Web) richiedano molto più tempo (minuti anziché meno di 1 secondo), quindi le sessioni si accumulano portando la CPU vicino al 90% .

Il problema scompare nel momento in cui quelle sessioni bloccate vengono eliminate forzatamente (sul lato DB) e 1) quando tutti i piani di esecuzione corrispondenti vengono cancellati manualmente (per le query) o 2) quando gli UDF vengono modificati (per le funzioni). Tutti i nuovi piani creati da SQL Server da quel momento funzionano perfettamente durante il giorno fino a quando non avrà lo stesso problema la mattina successiva. Inoltre, questo comportamento non è coerente al 100%, non lo vediamo davvero ogni mattina. Ma ci sono stati periodi in cui lo abbiamo visto costantemente per 4-5 giorni consecutivi.

Il problema si verifica nelle mattine di lavoro, è quando si accede a pagine Web / UI più intensamente, a quanto pare.

Qualcuno ha idea di cosa sta causando questo e come risolvere questo problema? Qualsiasi aiuto sarebbe molto apprezzato.


3
il plancache può essere rilasciato quando la macchina è sotto pressione della memoria o se si modificano le impostazioni a livello di db. (alter db). Dal momento che hai detto che non li elimini "manualmente" presumo che potrebbe essere la pressione della memoria. Quanta memoria ha la macchina? quali sono le tue impostazioni di memoria massima? hai un ambiente virtuale e forse RAM sovrallocata?
RayofCommand,

6
Perché sei in SP1. Prima di fare qualsiasi cosa applicare SP3. SQL Server è in grado di forzare i piani se rileva la pressione della memoria e necessita di più memoria per ospitare le pagine appositamente dalla ricostruzione dell'indice specialmente se si dispone di tabelle di grandi dimensioni. La ricostruzione dell'indice proverebbe a portare il maggior numero di pagine possibile. Quello che puoi fare è smettere di usare MP e usare la soluzione Ola Hallengren e vedere se questo aiuta. Cos'è la memoria massima del server?
Shanky,

1
Ragazzi, non sono un DBA, solo uno sviluppatore SQL. Sto solo chiedendo tutto questo perché va avanti da un po 'di tempo. Grazie per i tuoi commenti, cercherò di rispondere a tutti loro, anche se per ora trovo difficile seguirli (e tutto sembra abbastanza ovvio per te). Che cos'è MP?
peter.petrov,

1
@ peter.petrov stiamo cercando di aiutarti conoscendo il tuo ambiente. MP = Piani di manutenzione.
Kin Shah,

1
Il vero problema è che i tuoi piani di query sono così fragili. Le ricompilazioni possono avvenire in qualsiasi momento, anche durante il giorno. Nessuna garanzia Correggi le tue domande in modo che i piani diventino stabili. OPTION RECOMPILE o OPTIMIZE FOR UNKNOWN sono approcci a mazza che possono essere appropriati ed essere una soluzione rapida.
usr

Risposte:


2

Bene, ho alcune idee che potrebbero causare questo comportamento.

  1. Monitorate la pressione della memoria? Forse le tue query sollevano un certo limite che causerà lo svuotamento della cache del piano. Non conosco la tua applicazione, ma questo corrisponde ai tuoi log dei tuoi server frontend? C'è pressione anche durante questo periodo?
  2. Hai un SQL Server dedicato o il server condivide il suo hardware con altri processi / servizi? In caso contrario, prova a considerare di esternalizzare il tuo SQL Server su una macchina dedicata. Ciò ridurrà gli effetti collaterali di altri servizi.
  3. Potresti voler usare optimize for ad hoc workloads, che salverà semplicemente uno stub di piano e lo compili se è necessario. Ciò ridurrà il carico del plancache, riducendo così la possibilità di un rossore al plancache. Puoi abilitarlo usando sp_configure 'optimize for ad hoc workloads',1; reconfigure. Questo può essere fatto se hai abilitato l' advanced optionsutilizzo sp_configure 'show advanced options',1; reconfigure.
  4. Un'altra idea può essere il backup. Solo semplici backup. Se sono aggressivi, può accadere che anche la macchina subisca una pressione. Il momento in cui parli sembra solo un buon periodo per la pianificazione di un backup.
  5. Forse è abbastanza semplice un bug nel tuo script di manutenzione. Hai verificato se esiste un problema logico che causa la ricostruzione dello script da parte di tutti gli indici anziché solo quelli che soddisfano i criteri. Questo forse può causare anche questo.

Proprio accanto tutto questo possibilità, può essere utile per controllare i file di log per alcune modifiche alle opzioni affinity mask, affinity I/O maskei loro partner x64. Un'altra cosa può essere una modifica MAXDOPdell'opzione della tua istanza. Controlla anche i log per loro. Dovranno lavare anche il plancache.

Ultimo ma non meno importante, è ancora possibile eseguire una traccia sul lato server (basta configurarlo utilizzando il profiler, avviarlo, arrestarlo e utilizzare il comando sql per avviarlo nuovamente sul lato server). Accanto a questo perfmonè il tuo amico. Può guardare e monitorare i valori delle prestazioni per un certo periodo. Forse puoi vedere parallelismi nella pressione con alcune azioni sul tuo server che possono causare quelle flush.

Spero che questo ti possa aiutare, anche se la risposta arriva un po 'più tardi.

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.