SQL Server本身没有像mysql一样的慢查询日志,但是我们可以通过扩展事件去捕获阻塞的SQL语句。

下一步

下一步

如下

下一步

勾选收集事件
这里选择client_app_name、client_hostname、database_id、database_name、plan_handle、query_hash、request_id、session_id、sql_text字段
下一步

下一步–完成
管理 -会话 中找到新建的会话,右键启动会话
开始测试
–步骤一:打开进程阻塞阀值
sp_configure ‘show advanced options’, 1 ;
GO
RECONFIGURE ;
GO
sp_configure ‘blocked process threshold’, 10 ; --10代表秒
GO
RECONFIGURE ;
GO
–步骤二:新建测试数据
USE testSlowquerySQl
GO
create table tb_test(
id int identity(1,1) ,
ctxt varchar(50),
modtime datetime default(getdate()),
primary key(id)
)
GO
insert into dbo.tb_test(ctxt) values(‘A’);
insert into dbo.tb_test(ctxt) values(‘B’);
insert into dbo.tb_test(ctxt) values(‘C’);
GO
–步骤三:新建一个窗口,更新数据
USE testSlowquerySQl;
GO
begin tran
update dbo.tb_test set ctxt =‘C2’ where id = 3
–不提交,一直等待
–步骤四:再新建一个窗口,查询数据
USE testSlowquerySQl;
GO
select * from dbo.tb_test where id = 2
–步骤五:新建一个窗口,查询监控事件
select
t.event_data.value(’(event/@name)[1]’, ‘VARCHAR(50)’) as event_name,
t.event_data.value(’(event/@timestamp)[1]’, ‘DATETIME2’) as event_timestamp,
t.event_data.value(’(event/data[@name=“database_name”]/value)[1]’, ‘VARCHAR(255)’) as duration,
t.event_data.value(’(event/data[@name=“blocked_process”]/value/blocked-process-report)[1]’, ‘VARCHAR(MAX)’) as sql_text
from (
select cast(event_data as xml) as event_data
from sys.fn_xe_file_target_read_file(‘D:\dbbase\SQL2016\slowquerysql_0_133763899527870000.xel’, NULL, NULL, NULL)
) t




