我创建了一个扩展事件会话,我想在其中查看使用 nolock 提示的所有查询。我决定使用它而不是 sql trace 来最小化可能的性能影响。会话的创建类似于以下语句:
CREATE EVENT SESSION [SCOMDB_debug] ON SERVER
ADD EVENT sqlserver.deprecation_announcement(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)),
ADD EVENT sqlserver.rpc_completed(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%'))),
ADD EVENT sqlserver.rpc_starting(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%'))),
ADD EVENT sqlserver.sp_statement_completed(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%'))),
ADD EVENT sqlserver.sp_statement_starting(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%'))),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%'))),
ADD EVENT sqlserver.sql_batch_starting(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%'))),
ADD EVENT sqlserver.sql_statement_completed(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%'))),
ADD EVENT sqlserver.sql_statement_starting(SET collect_statement=(1)
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%')))
ADD TARGET package0.event_file(SET filename=N'M:\MSSQL11.SCOMDB\MSSQL\Log\SCOMDB_debug.xel',max_file_size=(500))
WITH (MAX_MEMORY=40960 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO
Run Code Online (Sandbox Code Playgroud)
结果是数据库实例(用于 SCOM 数据库)变得非常缓慢,应用程序几乎无法使用。
等待统计信息中充满了 SOS_SCHEDULER_YIELD …
我想测试 tempdb 溢出警告,所以我在 SQL Server 2014 上运行以下脚本:
USE tempdb
IF OBJECT_ID('tempdb..tblTest') IS NOT NULL DROP TABLE tblTest
CREATE TABLE tblTest
(
c1 INT PRIMARY KEY CLUSTERED,
c2 INT ,
c3 CHAR (1000)
);
GO
SET NOCOUNT ON;
BEGIN TRANSACTION;
DECLARE @i AS INT;
SET @i = 1;
WHILE @i <= 10000
BEGIN
INSERT INTO tblTest (c1, c2, c3)
VALUES (@i, @i, 'a');
SET @i = @i + 1;
END
COMMIT TRANSACTION;
GO
UPDATE STATISTICS dbo.tblTest
GO
SET STATISTICS XML ON; …Run Code Online (Sandbox Code Playgroud) sql-server optimization sorting sql-server-2014 query-performance