Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je me connecter et trouver les requêtes les plus coûteuses ?

  1. Utilisez SQL Server Profiler (dans le menu Outils de SSMS) pour créer une trace qui consigne ces événements :

     RPC:Completed
     SP:Completed
     SP:StmtCompleted
     SQL:BatchCompleted
     SQL:StmtCompleted
    
  2. Vous pouvez commencer avec le modèle de trace standard et l'élaguer. Vous n'avez pas précisé s'il s'agissait d'une base de données spécifique ou de l'ensemble du serveur, si c'est pour des bases de données spécifiques, incluez la colonne DatabaseID et définissez un filtre sur votre base de données (SELECT DB_ID('dbname') ). Assurez-vous que la colonne de données de lectures logiques est incluse pour chaque événement. Définissez la trace pour qu'elle se connecte à un fichier. Si vous laissez cette trace s'exécuter sans surveillance en arrière-plan, c'est une bonne idée de définir une taille de fichier de trace maximale, disons 500 Mo ou 1 Go si vous avez beaucoup d'espace (tout dépend de l'activité sur le serveur, donc vous devrez le sucer et voir).

  3. Démarrez brièvement la trace, puis mettez-la en pause. Allez dans Fichier->Exporter->Définition de trace de script et choisissez votre version de base de données et enregistrez-la dans un fichier. Vous avez maintenant un script sql qui crée une trace qui a beaucoup moins de surcharge que l'exécution via l'interface graphique du profileur. Lorsque vous exécutez ce script, il affichera 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 est terminée car la taille maximale du fichier a été atteinte, soit vous avez arrêté la trace en cours d'exécution à l'aide de

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

Vous pouvez charger la trace dans le profileur, ou utiliser ClearTrace (très pratique) ou la 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, comme 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.