2009-12-21 3 views
20

Nous avons créé tellement de procédures stockées inefficaces dans notre application, nous remettons toujours à plus tard pour le rendre plus efficace jusqu'à ce que nous ayons un sérieux problème avec les performances de la base de données. Maintenant, je pense à le réparer un à un par la procédure stockée la plus souvent exécutée.La procédure stockée la plus exécutée?

Quelle est la meilleure façon de déterminer quelle procédure stockée est la plus exécutée?

Existe-t-il un script pouvant indiquer quelle procédure stockée est la plus exécutée?

Répondre

23

Utilisation:

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 

Référence: SQL SERVER – 2005 – Find Highest/Most Used Stored Procedure

+0

Vous pouvez également extraire le 'SUBSTRING (texte, statement_start_offset/2, cas où (statement_end_offset = -1), puis len (texte) autre (statement_end_offset-statement_start_offset)/2 fin)' pour la requête réelle à l'intérieur du SP –

+0

@Remus: Ajouté, merci! –

+0

il doit être SUBSTRING (qt.text, qs.statement_start_offset/2, CAS WHEN (qs.statement_end_offset = -1) ALORS LEN (qt.text) ELSE (qs.statement_end_offset - qs.statement_start_offset)/2 END) AS actual_query, –

0

Situation typique ..

Exécutez l'analyseur de performances Et puis lancez votre application certains filtres mis à capturer nombre de lectures/écritures/scans etc ..

1

Un moyen rapide d'y parvenir est de Exécutez SQL Profiler, puis "groupez" votre trace par TextData.

  • Allez dans vos propriétés de trace
  • Sous l'onglet Événements de sélection, cliquez sur Organiser Colonnes ...
  • Cliquez sur TextData, et déplacez jusqu'à la zone « Groupes ».

Vous pouvez également uniquement visionner des événements spécifiques, tels que SQL Batch Completed. Si je me souviens bien, cela vous donnera des durées et d'autres statistiques pratiques à grouper/filtrer.

1

Un autre outil fantastique est Performance Dashboard de Microsoft. link text

Questions connexes