记录所有超过 X 秒的查询

car*_*reo 5 performance sql-server sql-server-2008-r2

我有一个数据库 Microsoft SQL Server 2008r2。我有一些不同编程语言的应用程序。

我想记录所有超过 X 秒的查询。

我想我应该创建一个事件会话,但我对它们的理解不足以完成这个特定的任务。理想的答案是包含一个包含活动会话示例的在线教程的链接;即使是一本书推荐也会去。

几年前我在微软做过6231A“维护一个Microsoft SQL Server数据库”的培训,但此后我就没有实践过;课件涵盖了论点,但我无法理解。

Stu*_*ore 8

您正在寻找的语法将与此非常相似:


create event session longrunning_statements on server
add event sqlserver.sql_statement_completed
(
where (duration > 5000000)
)
add target package0.asynchronous_file_target
(Set filename='c:\capture\xe_longrunning_statement.xel', 
metadatafile='c:\capture\xe_longrunning_statement.xem');

alter event sesession longrunning_statements on server state=start;
Run Code Online (Sandbox Code Playgroud)

这将设置一个事件会话,它将跟踪需要超过 5 秒才能完成的 sql 语句。持续时间过滤器基于微秒顺便说一句。

如果您想将其限制为特定的数据库(在这种情况下,数据库 id=5 的 db,那么您可以将过滤器更改为:

where (duration > 5000000 and database_id=5)
Run Code Online (Sandbox Code Playgroud)

如果需要,还有许多其他过滤器可以将其与特定会话或用户联系起来。

此事件会话会将其结果记录到文件 ( c:\capture\xe_longrunning_statement.xel) 中,该文件可以使用如下fn_xe_file_target_read_file函数读入:

SELECT *
    FROM
        sys.fn_xe_file_target_read_file
        (
            'c:\capture\xe_longrunning_statement*.xel',
            'c:\capture\xe_longrunning_statement.xem',
            null,
            null
        );
Run Code Online (Sandbox Code Playgroud)

(请注意,我已将 2008R2 标准用于 tge xel/xem 文件并设置目标。2012 年略有不同,但此语法仍然有效)。文件名中的 * 是为了让函数知道您想要加载所有文件,如果它们因大小而翻转。

然后您需要通过您选择的 XML 工具解析数据。

完成捕获后,您可以按如下方式整理:


alter event session longrunning_statements on server state=stop;
drop event session longrunning_statements;
Run Code Online (Sandbox Code Playgroud)

最好的在线资源之一是 Jonathan Kehayais 的 31 天扩展事件 - https://www.sqlskills.com/blogs/jonathan/an-xevent-a-day-31-days-of-extended-events/ - 其中通过大量示例引导您了解该主题。