J'essaie de capturer quotidiennement des requêtes coûteuses et de les save dans un tableau pour une parsing plus approfondie. J'utilise le travail quotidien pour faire cela qui fonctionne tous les jours la nuit.
Utiliser le code ci-dessous pour capturer des requêtes coûteuses:
CREATE TABLE [dbo].[CostlyQueries]( [Id] [int] IDENTITY(1,1) NOT NULL, [QueryText] [nvarchar](max) NULL, [execution_count] [bigint] NOT NULL, [total_logical_reads] [bigint] NOT NULL, [last_logical_reads] [bigint] NOT NULL, [total_logical_writes] [bigint] NOT NULL, [last_logical_writes] [bigint] NOT NULL, [total_worker_time] [bigint] NOT NULL, [last_worker_time] [bigint] NOT NULL, [total_elapsed_time_in_S] [bigint] NULL, [last_elapsed_time_in_S] [bigint] NULL, [last_execution_time] [datetime] NULL, [query_plan] [xml] NULL, [DateAdded] [datetime] NULL DEFAULT (getdate()) ) INSERT INTO CostlyQueries (QueryText, execution_count, total_logical_reads, last_logical_reads, total_logical_writes, [last_logical_writes], total_worker_time, last_worker_time , total_elapsed_time_in_S, last_elapsed_time_in_S, last_execution_time, query_plan ) SELECT TOP 100 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) AS QueryText, 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 last_elapsed_time_in_S desc, qs.total_worker_time DESC -- CPU time
Deux questions ici:
Quand ces DMV (données système) sont-ils actualisés? Quelque part je l'ai lu sera rafraîchi lors du recyclage des services SQL. Quelqu'un a-t-il des détails à ce sujet?
- pyodbc appelle sp_unprepare après sp_prepexec. Cela affecte-t-il les performances des requêtes paramétrées?
- Comment faire pour afficher perso DateTime dans DataGridView
- Comparer les hôtels à Linq
- récupérer datatables de la table de gauche lorsque la condition n'est pas remplie
- SQL Case Sensitive Group par
Les requêtes que j'ai écrites pour capturer des requêtes coûteuses utilisent sys.dm_exec_query_stats, pour une raison quelconque, elles n'ont pas capturé une requête longue durée pendant le week-end. Quelqu'un peut-il aider à corriger / get plus de détails afin que nous puissions capturer plus de mésortingques?
Ajout d'une requête correcte comme suggéré par Aaron Bertrand dans les commentaires ci-dessous: – Modification croisée s'applique à appliquer externe –
SELECT TOP 100 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) AS QueryText, 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 OUTER APPLY sys.dm_exec_sql_text(qs.sql_handle) qt OUTER APPLY sys.dm_exec_query_plan(qs.plan_handle) qp ORDER BY last_elapsed_time_in_S desc, qs.total_worker_time DESC -- CPU time
Les données restront dans le DMV tant que le plan est dans le cache. Les plans peuvent être retirés du cache pour plusieurs raisons différentes (pression de la memory, recompilation, etc.). En outre, toutes sortes de choses comme changer les parameters ou redémarrer le server vont bien sûr tout vider.
Si vous voulez que ce soit un peu fiable, vous devrez l'exécuter assez fréquemment, afin que tout ce qui est important ne soit pas perdu.
Il n'y a rien de mal à faire votre propre parsing, car elle sera toujours à 100% adaptée à vos besoins, cependant, je vous suggère de regarder également dans le SQL Server Data Collector et Data Collection Sets .