sql-server - 如何记录并查找最昂贵的查询?

标签 sql-server sql-server-2008 profiling

sql2k8 中的事件监视器使我们能够看到最昂贵的查询。好的,这很酷,但是有没有办法可以记录此信息或通过查询分析器获取此信息?我真的不想打开 Sql 管理控制台并查看事件监视器仪表板。

我想找出哪些查询写得不好/架构设计得不好等等。

非常感谢您的帮助!

最佳答案

  1. 使用 SQL Server Profiler(位于 SSMS 的工具菜单上)创建记录这些事件的跟踪:

     RPC:Completed
     SP:Completed
     SP:StmtCompleted
     SQL:BatchCompleted
     SQL:StmtCompleted
    
  2. 您可以从标准跟踪模板开始并对其进行修剪。您没有指定这是针对特定数据库还是整个服务器,如果是针对特定数据库,请包含 DatabaseID 列并为您的数据库设置过滤器 (SELECT DB_ID('dbname') )。确保每个事件都包含逻辑读取数据列。设置跟踪以记录到文件中。如果您要让此跟踪在后台无人值守地运行,则最好设置最大跟踪文件大小,例如 500MB 或 1GB(如果您有足够的空间)(这完全取决于服务器上的事件量,因此你必须吸吮它才能看到)。

  3. 短暂启动跟踪,然后暂停。转到文件->导出->脚本跟踪定义并选择您的数据库版本,然后保存到文件。您现在拥有一个创建跟踪的 SQL 脚本,该脚本的开销比通过探查器 GUI 运行要少得多。当您运行此脚本时,它将输出跟踪 ID(通常是 @ID=2);记下这一点。

  4. 一旦您有了跟踪文件 (.trc)(由于达​​到最大文件大小而完成了跟踪,或者您使用以下命令停止了正在运行的跟踪

    执行 sp_trace_setstatus @ID, 0
    EXEC sp_trace_setstatus @ID, 2

您可以将跟踪加载到探查器中,或使用 ClearTrace (非常方便)或将其加载到表中,如下所示:

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

然后您可以运行查询来聚合数据,例如:

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

一旦确定了代价高昂的查询,您就可以生成并检查实际的执行计划。

关于sql-server - 如何记录并查找最昂贵的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/257906/

相关文章:

SQL SELECT 多条件多对多关系

c# - 如何拦截来自应用程序的 HTTP 调用?

asp.net - 如何通过 sql server 更改或更新 asp.net 成员(member)中的密码

c# - 记录大数据字段 - 更新而不获取?

performance - Grails 应用程序分析和性能调整

mysql - PHP + MySQL 分析器

sql-server - SQL Server 分组

sql - 左连接和有条件的地方没有给出预期的结果?

SQL Server 选择不同

sql - 每个项目选择 X 个随机用户