Come si fa a cancellare tutti i vecchi piani di query da Microsoft SQL Server?
-
16-10-2019 - |
Domanda
Abbiamo un off l'applicazione mensola che utilizza un database Microsoft SQL. All'interno di questa applicazione prendiamo e scegliamo vari criteri di selezione per ogni rapporto. Questa applicazione quindi esegue questi rapporti.
Credo che abbiamo un problema di piano di query. La prima relazione corriamo ogni giorno, corre molto veloce 7 minuti. Qualsiasi rapporto si corre dopo la prima relazione prende più di un'ora.
Ogni sera abbiamo eseguire un'attività pianificata che si ferma e comincia a SQL Server Agent e SQL Server. Ci sono circa 25 altri database all'interno di questa istanza di SQL Server. Nessun altro database hanno problemi di prestazioni, solo l'uno al largo della shelf ho menzionato in precedenza.
C'è un modo per cancellare tutti i piani di query che SQL Server è attualmente nella memoria?
Come posso fare questo senza impattare il 30 o giù di lì gli utenti che si basano su altri database sullo stesso server?
Soluzione
Le mie scuse per la mia risposta precedente.
1) Aggiungere l'opzione WITH RECOMPILE per l'istruzione CREATE PROCEDURE se si sa che la query può variare ogni volta che viene eseguito dalla stored procedure. Le impedisce opzione WITH RECOMPILE riutilizzando il piano di esecuzione stored procedure, quindi SQL Server non memorizza un piano per questa procedura e la procedura viene ricompilata in fase di esecuzione. Utilizzando l'opzione WITH RECOMPILE può migliorare le prestazioni se la query può variare ogni volta che viene eseguito dalla stored procedure perché in questo caso non verrà utilizzato il piano di esecuzione sbagliata.
2) Devi creare una guida di piano che utilizza un'USO interrogazione pIANO suggerimento per ogni tipo di query (ogni procedura stored tipo richiesta) al piano di esecuzione forza.
Altri suggerimenti
È chiesto due domande qui. In primo luogo, si vuole sapere se è possibile rimuovere tutti i piani memorizzati nella memoria per un'istanza di SQL. Che si fa con DBCC FREEPROCCACHE come suggerito Matt M.
La seconda domanda che hai chiesto è: "Come posso fare questo senza impattare il 30 o giù di lì gli utenti che si basano su altri database sullo stesso server?". La risposta breve è "non si può". Se si rimuovono tutti i piani rispetto agli altri utenti che si affidano a piani di essere in memoria probabilmente subiranno un calo di prestazioni.
La soluzione per questo richiede un intervento manuale. È possibile utilizzare DBCC FREEPROCCACHE per rimuovere piani specifici fornendo avete la plan_handle.
Da quello che si sta descrivendo sopra suona come un problema di piano, ma non sono certo che la rimozione dei piani è la risposta. Vorrei puntare nella direzione di sniffing dei parametri prima di pensare di rimuovere i piani:
Si dovrebbe essere in grado di ottimizzare le query piuttosto che scherzare con DBCC FREEPROCCACHE base a una pianificazione. Vorrei inoltre consigliare che si spende tempo analizzando gli eventi di attesa per l'istanza.
Using this command, you can clear the entire procedure cache down to a single command. Definitely read the documentation before using this command. Read the Remarks section a few times.
Clearing the procedure cache will cause stored procedure caches to be recompiled upon next use. This could impact performance. Use carefully!
Matt