如何识别sql server中的慢查询?

ada*_*box 6 performance debugging sql-server

在谷歌上搜索这个问题的答案时,我发现了像这样的长而复杂的说明,一个简短的参考链接,比如这篇文章

我正在寻找一个尽可能简洁的过程来生成具有执行时间的 SQL 查询列表,其中执行时间 > some_threshold。

ada*_*box 9

我想答案不在这里,因为它太简单了!这是我想出的:

  1. 打开SQL Server Profiler(在性能工具中)
  2. File -> New Trace...
  3. 连接到您的数据库
  4. 单击事件选择选项卡
  5. 仅选择与 SQL 查询完成对应的事件:
    • RPC:Completed
    • SQL:BatchCompleted
  6. 单击列过滤器...
  7. 单击列表中的持续时间
  8. 展开大于或等于并输入您认为“慢”的阈值时间(以毫秒为单位)
  9. 单击确定
  10. 点击运行

如果您有很多应用程序正在运行并且想要减少噪音ApplicationName,您可以按、NTUserName等过滤。您也可以只显示一些列,例如 justTextDataDuration

这是对 Profiler 的更高级处理


Dan*_*SQL 6

您可以使用它来获取前 10 个昂贵的查询(如果您使用的是 Sql server 2005 及更高版本):

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 -- logical reads
-- ORDER BY qs.total_logical_writes DESC -- logical writes
-- ORDER BY qs.total_worker_time DESC -- CPU time
Run Code Online (Sandbox Code Playgroud)