2009-12-21 22 views
20

Abbiamo creato così tante stored procedure inefficienti nella nostra applicazione, abbiamo sempre rimandato per renderlo più efficiente finché non avremo un serio problema con le prestazioni del database.Procedura memorizzata più eseguita?

Ora, sto pensando di risolverlo uno per uno con la stored procedure eseguita più spesso.

Qual è il modo migliore per capire quale stored procedure è la più eseguita?

C'è uno script che può mostrare quale stored procedure è la più eseguita?

risposta

23

Usa:

SELECT TOP 10 
     qt.TEXT AS 'SP Name', 
     SUBSTRING(qt.text, qs.statement_start_offset/2, CASE WHEN (qs.statement_end_offset = -1) THEN LEN(qt.text) ELSE (qs.statement_end_offset - qs.statement_start_offset)/2 END) AS actual_query, 
     qs.execution_count AS 'Execution Count', 
     qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime', 
     qs.total_worker_time AS 'TotalWorkerTime', 
     qs.total_physical_reads AS 'PhysicalReads', 
     qs.creation_time 'CreationTime', 
     qs.execution_count/DATEDIFF(Second, qs.creation_time, GETDATE()) AS 'Calls/Second' 
    FROM sys.dm_exec_query_stats AS qs 
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt 
WHERE qt.dbid = (SELECT dbid 
        FROM sys.sysdatabases 
        WHERE name = '[your database name]') 
ORDER BY qs.total_physical_reads DESC 

Riferimento: SQL SERVER – 2005 – Find Highest/Most Used Stored Procedure

+0

È anche possibile estrarre il 'SUBSTRING (Testo, statement_start_offset/2, caso in cui (statement_end_offset = -1), allora len (Testo) altro (statement_end_offset-statement_start_offset)/2 finale)' per la query effettiva all'interno della SP –

+0

@Remus: Aggiunto, grazie! –

+0

dovrebbe essere SUBSTRING (qt.text, qs.statement_start_offset/2, CASE WHEN (qs.statement_end_offset = -1) THEN LEN (qt.text) ELSE (qs.statement_end_offset - qs.statement_start_offset)/2 END) AS actual_query, –

0

situazione tipica ..

Eseguire l'analizzatore di prestazioni e quindi avviare l'applicazione impostare alcuni filtri per catturare elevato numero di letture/scritture/scansioni ecc ..

1

Un modo rapido per raggiungere questo obiettivo è eseguire SQL Profiler e quindi "raggruppare" la traccia mediante TextData.

  • entra nella tua proprietà Trace
  • Nella scheda Selezione eventi, fare clic su Organizza Colonne ...
  • Cliccare sulla TextData, e spostare fino a nell'area "Gruppi".

Si può anche solo voler guardare eventi specifici, come SQL Batch completato. Se ricordo, questo ti darà durate e altre utili statistiche da raggruppare/filtrare per.

1

Un altro fantastico strumento è Microsoft Performance Dashboard. link text

Problemi correlati