2008-11-03 6 views
62

Le moniteur d'activité dans sql2k8 nous permet de voir les requêtes les plus chères. Ok, c'est cool, mais y at-il un moyen que je peux enregistrer ces informations ou obtenir cette information via l'analyseur de requête? Je ne veux pas vraiment que la console Sql Management s'ouvre et que je regarde le tableau de bord du moniteur d'activité.Comment puis-je me connecter et trouver les requêtes les plus chères?

Je veux savoir quelles requêtes sont mal écrits/schéma est mal conçu, etc.

tas Merci pour toute aide!

Répondre

60
  1. Utiliser SQL Server Profiler (dans le menu outils SSMS) pour créer une trace qui enregistre ces événements:

    RPC:Completed 
    SP:Completed 
    SP:StmtCompleted 
    SQL:BatchCompleted 
    SQL:StmtCompleted 
    
  2. Vous pouvez commencer par le modèle de trace standard et élaguer. Vous n'avez pas spécifié si c'était pour une base de données spécifique ou le serveur entier, si c'est pour des Db spécifiques, incluez la colonne DatabaseID et définissez un filtre à votre DB (SELECT DB_ID('dbname')). Assurez-vous que la colonne de données Lectures logiques est incluse pour chaque événement. Définissez la trace pour se connecter à un fichier. Si vous laissez cette trace s'exécuter sans surveillance en arrière-plan, il est recommandé de définir une taille de fichier de trace maximale de 500 Mo ou 1 Go si vous disposez de suffisamment d'espace (tout dépend de l'activité du serveur, vous devrez le sucer et voir).

  3. Lancez brièvement la trace, puis mettez-la en pause. Aller à Fichier-> Exporter-> Script Trace Définition et choisissez votre version DB, et enregistrer dans un fichier. Vous avez maintenant un script sql qui crée une trace qui a beaucoup moins de frais que l'exécution de l'interface graphique du profileur. Lorsque vous exécutez ce script, il affiche l'ID de trace (généralement @ID=2); notez ceci.

  4. Une fois que vous avez un fichier de trace (.trc) (soit la trace terminée en raison d'atteindre la taille maximale de fichier ou vous arrêté la trace en cours d'exécution à l'aide

    EXEC sp_trace_setstatus @ID, 0
    EXEC sp_trace_setstatus @ID , 2

Vous pouvez charger la trace dans profileur, ou utilisez ClearTrace (très pratique) ou le charger dans une table comme ceci:

SELECT * INTO TraceTable 
FROM ::fn_trace_gettable('C:\location of your trace output.trc', default) 

Ensuite, vous pouvez exécuter une requête pour agréger les données telles que celle-ci:

SELECT COUNT(*) AS TotalExecutions, 
    EventClass, CAST(TextData as nvarchar(2000)) 
,SUM(Duration) AS DurationTotal 
,SUM(CPU) AS CPUTotal 
,SUM(Reads) AS ReadsTotal 
,SUM(Writes) AS WritesTotal 
FROM TraceTable 
GROUP BY EventClass, CAST(TextData as nvarchar(2000)) 
ORDER BY ReadsTotal DESC 

Une fois que vous avez identifié les requêtes coûteuses, vous pouvez générer et examiner les plans d'exécution réels.

+0

cheers mitch! semble un peu plus complexe que ce que je pensais était nécessaire, mais je vais certainement y aller un coup :) à la vôtre! –

+0

Été dehors - je m'attends à avoir une chance vers la fin de nov .. et alors je marquerai la question ou demanderai plus de q. –

2

Le profileur SQL Server ferait-il ce dont vous avez besoin? Je n'ai pas encore utilisé 2008, donc je ne sais pas si l'outil est toujours là, mais je crois que vous pouvez configurer une trace pour consigner les requêtes répondant à des critères spécifiques (tels que ceux qui exécutent et conduisent le CPU au-dessus un certain seuil). Nous l'avons utilisé sur notre projet et il nous a bien aidés à résoudre les problèmes d'exécution (mais ne le laissez pas à plein temps, comptez sur les compteurs de performance Windows pour le suivi de l'intégrité des performances).

+0

hmm .. J'ai utilisé les tas de profileurs, mais cela ne résume pas l'information. c'est une ligne par type de requête. –

4

Je n'avais jamais entendu parler de cet outil auparavant, mais Microsoft fournit un ensemble de rapports qui font un travail fantastique pour vous donner exactement cela - y compris les requêtes les plus lentes. Découvrez leur Performance Dashboard Reports.

Vous ne savez pas si elles sont compatibles avec SQL 2008, mais qu'elles méritent d'être vérifiées.

2

Il existe un nouvel outil, Performance Studio dans SQL Server 2008 qui s'appuie sur les vues de gestion dynamique gérées automatiquement par le serveur, qui donne un aperçu des performances du serveur. Cela vaut la peine de vérifier.

20

Le script suivant vous donne le résultat.

SELECT TOP 10 
SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, 
((CASE qs.statement_end_offset 
WHEN -1 THEN DATALENGTH(qt.TEXT) 
ELSE qs.statement_end_offset 
END - qs.statement_start_offset)/2)+1), 
qs.execution_count, 
qs.total_logical_reads, 
qs.last_logical_reads, 
qs.total_logical_writes, qs.last_logical_writes, 
qs.total_worker_time, 
qs.last_worker_time, 
qs.total_elapsed_time/1000000 total_elapsed_time_in_S, 
qs.last_elapsed_time/1000000 last_elapsed_time_in_S, 
qs.last_execution_time,qp.query_plan 
FROM sys.dm_exec_query_stats qs 
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt 
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp 
ORDER BY qs.total_logical_reads DESC 
+1

C'est exactement ce que je voulais. Il est facile de créer un travail pour l'enregistrer. Merci. – Jbecwar

+17

Est-ce que ça vient d'ici? => http://blog.sqlauthority.com/2010/05/14/sql-server-find-most-expensive-queries-using-dmv/ Si oui, c'est un meilleur style pour le mentionner ... – YvesR