Perché ci vuole così tanto tempo per calcolare un piano di esecuzione?


9

Uno dei nostri clienti è appena passato a un nuovo server.

Per una particolare procedura memorizzata la prima volta che la si esegue, l'esecuzione richiede più di tre minuti. Le esecuzioni successive sono meno di 1 secondo.

Questo mi porta a credere che i primi tre minuti siano occupati principalmente nel calcolo del piano di esecuzione. Le esecuzioni successive utilizzano quindi il piano memorizzato nella cache ed eseguono istantaneamente.

Nei nostri database di test sono necessari circa 5 secondi per calcolare il piano per la stessa procedura.

Non vedo nulla di terribile nel piano stesso, anche se non immagino che sia rilevante in quanto il piano mostra quanto tempo impiega per eseguire la query, non per calcolare se stesso.

Il server è un 16 core con 24 GB di memoria. Non si verificano carichi pesanti di CPU o memoria.

Che cosa potrebbe causare un calcolo così lento solo su un determinato database?

Quali passi posso prendere per trovare la causa del problema?

modificare

Quindi sono riuscito ad accedere al server e ho eseguito la query con SET SHOWPLAN_XML ON .

Posso confermare che CompileTime per la query sta occupando il 99% del tempo di esecuzione della query. Lo StatementOptmEarlyAbortReason è "TimeOut" , il nostro database di test con una copia del loro database il motivo è MemoryLimitExceeded.


1
Sei sicuro che sia la compilazione del piano che richiede molto tempo, non solo la lettura dei dati nella cache dal disco?
Mark Storey-Smith,

1
Il tempo di compilazione viene visualizzato nello stesso XML del piano. Hai identificato che è sicuramente tempo di compilazione e non qualcos'altro, ad esempio l'aggiornamento automatico sincrono delle statistiche? In quale versione di SQL Server sei attivo?
Martin Smith,

@ MarkStorey-Smith Beh, non sono proprio sicuro di niente. So che l'esecuzione di DBCC FREEPROCCACHE , che cancella solo la cache del piano, richiederà il tempo di query successivo fino a 3 minuti.
Mongus Pong,

@MartinSmith Ah sì, molto utile, ho usato il piano di query visive. Sì, il tempo di compilazione è approssimativamente l'intero tempo di esecuzione della query. Siamo su SQL Server 2008 R2.
Mongus Pong,

@MongusPong - Se si crea una copia solo statistica del database di produzione, è possibile riprodurlo nel proprio ambiente di test? Cosa dice il piano StatementOptmEarlyAbortReason?
Martin Smith,

Risposte:


9

Odio rispondere alla mia domanda, soprattutto perché ho avuto così tanto aiuto dagli altri per trovare la soluzione, ma qui va.

Il problema era dovuto ad alcune statistiche dud nel database. Guardando il piano di esecuzione, l'ottimizzatore si aspettava 11,5 TB di dati restituiti dalla query. In realtà stava ricevendo 87kb. Ora so che enormi discrepanze tra le righe attese e quelle effettive restituite indicano che le statistiche non sono aggiornate.

Semplicemente in esecuzione

exec sp_updatestats

impone al database di aggiornare le statistiche per tutte le tabelle.

Ciò ha portato il tempo di esecuzione della query da 3 minuti a 6 secondi. Tutti vincitori!

Grazie per tutto l'aiuto ragazzi. : 0)

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.