Come cancellare tutti i vecchi piani di query da Microsoft SQL Server?


12

Abbiamo un'applicazione standard che utilizza un database Microsoft SQL. All'interno di questa applicazione selezioniamo e selezioniamo vari criteri di selezione per ciascun rapporto. Questa applicazione quindi esegue questi rapporti.

Credo che abbiamo un problema con il piano di query. Il primo rapporto che eseguiamo ogni giorno dura 7 minuti. Qualsiasi rapporto che eseguiamo dopo il primo rapporto richiede più di un'ora.

Ogni notte eseguiamo un'attività pianificata che arresta e avvia SQL Server Agent e SQL Server. Esistono circa 25 altri database all'interno di questa istanza di SQL Server. Nessun altro database ha problemi di prestazioni, solo quello di cui ho parlato prima.

C'è un modo per cancellare tutti i piani di query che SQL Server ha attualmente in memoria?

Come posso farlo senza influire su circa 30 utenti che fanno affidamento su altri database sullo stesso server?


Risposte:


7

Mi scuso per la mia risposta precedente.

1) Aggiungere l'opzione WITH RECOMPILE all'istruzione CREATE PROCEDURE se si sa che la query varierà ogni volta che viene eseguita dalla procedura memorizzata. L'opzione WITH RECOMPILE impedisce il riutilizzo del piano di esecuzione della procedura memorizzata, pertanto SQL Server non memorizza nella cache un piano per questa procedura e la procedura viene ricompilata in fase di esecuzione. L'uso dell'opzione WITH RECOMPILE può migliorare le prestazioni se la query varia ogni volta che viene eseguita dalla procedura memorizzata perché in questo caso non verrà utilizzato il piano di esecuzione errato.

2) È necessario creare una guida di piano che utilizza un suggerimento di query USE PLAN per ogni tipo di query (ogni tipo di richiesta di procedura memorizzata) per forzare il piano di esecuzione.

Ecco un articolo sul piano di esecuzione che può aiutare.


Sono d'accordo con WITH RECOMPILE, l'ho fatto con i sistemi che ho creato. Tuttavia, non ho accesso alla fonte sql ... funziona all'interno di un'applicazione.
Michael Riley - AKA Gunny,

@Cape Cod Gunny in questo caso provare DBCC FLUSHPROCINDB: utilizzato per cancellare la cache delle procedure memorizzate per un database specifico su un SQL Server, non l'intero SQL Server. È possibile che si desideri utilizzare questo comando prima del test per assicurarsi che i precedenti piani di stored procedure non influiscano negativamente sui risultati del test. Esempio: DECLARE @intDBID INTEGER SET @intDBID = (SELECT dbid FROM master.dbo.sysdatabase DOVE nome = 'database_name') DBCC FLUSHPROCINDB (@intDBID)
garik

il problema è stato risolto. Si è scoperto che una tabella temporanea utilizzata per memorizzare i criteri di ricerca accumulava continuamente dati. Il processo dovrebbe troncare i dati da questa tabella prima di raccogliere i dati. Grazie per il bel frammento di sql.
Michael Riley - AKA Gunny,

13

Hai fatto due domande qui. Innanzitutto, si desidera sapere se è possibile rimuovere tutti i piani archiviati in memoria per un'istanza di SQL. Questo viene fatto con DBCC FREEPROCCACHE come suggerito da Matt M.

La seconda domanda che hai posto è "Come posso farlo senza influire su circa 30 utenti che fanno affidamento su altri database sullo stesso server?". La risposta breve è "non puoi". Se rimuovi tutti i piani rispetto agli altri utenti che fanno affidamento sui piani in memoria, probabilmente subiranno un calo delle prestazioni.

Per risolvere il problema, è necessario un intervento manuale. È possibile utilizzare DBCC FREEPROCCACHE per rimuovere piani specifici purché si disponga di plan_handle.

Da quello che stai descrivendo sopra suona come un problema di piano, ma non sono sicuro che la rimozione sia la rimozione dei piani. Vorrei indicarti la direzione dello sniffing dei parametri prima di pensare alla rimozione dei piani:

http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/08/11/conor-vs-misbehaving-parameterized-queries-optimize-for-hints.aspx

Dovresti essere in grado di ottimizzare le query piuttosto che scherzare con DBCC FREEPROCCACHE su base programmata. Vorrei anche consigliare di dedicare tempo ad analizzare gli eventi di attesa per la propria istanza.


DBCC FREEPROCCACHE non ha risolto il problema. Controllo l'attività e gli eventi. Ci sono 0 I / O fisici. Sembra essere sospeso su questa applicazione: .Net Sql Client Data Provider. Il tipo di attesa è CXPACKET.
Michael Riley - AKA Gunny,

CXPACKET implica che la tua query sta andando in parallelo. Puoi accertare quanti thread sono in esecuzione per la query ed esaminare le loro attese? Puoi utilizzare lo strumento gratuito di Adam Machanic WhoIsActive sqlblog.com/files/folders/release/entry29675.aspx .
SQLRockstar,

7

DBCC FREEPROCCACHE

Utilizzando questo comando, è possibile cancellare l'intera cache delle procedure fino a un singolo comando. Leggere sicuramente la documentazione prima di utilizzare questo comando. Leggi la sezione Commenti alcune volte.

Svuotare la cache delle procedure causerà la ricompilazione delle cache delle procedure memorizzate al successivo utilizzo. Ciò potrebbe influire sulle prestazioni. Usa con attenzione!

opaco


Ho provato a utilizzare DBCC FREEPROCCACHE e il problema non è stato risolto. Ho finito per uccidere il processo dopo 1 ora.
Michael Riley - AKA Gunny,
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.