我有一个扩展事件可以过滤我的慢速查询。我为其创建了以下脚本。
CREATE EVENT SESSION [SlowQueriesAndStatementsLargerThan3Seconds] ON SERVER
ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1)
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
WHERE ([duration]>=(3000000))),
ADD EVENT sqlserver.sp_statement_completed(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_name,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([duration]>=(3000000))),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
WHERE ([duration]>=(3000000)))
ADD TARGET package0.event_file(SET filename=N'SlowQueriesAndStatementsLargerThan3Seconds'),
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=ON)
GO
Run Code Online (Sandbox Code Playgroud)
我想包括我的查询在速度缓慢时正在等待的位置。我想包含它的 wait_info ,但是当我添加它时,我的跟踪充满了与其他查询无关的等待。为了跟踪等待情况,我添加了以下事件:
CREATE EVENT SESSION [SlowQueriesAndStatementsLargerThan3Seconds] ON SERVER
ADD EVENT sqlos.wait_info(
ACTION(sqlos.task_elapsed_quantum,sqlos.task_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.session_id,sqlserver.sql_text)
WHERE ([opcode]='End')),
ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1)
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
WHERE ([duration]>=(3000000))),
ADD EVENT sqlserver.sp_statement_completed(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_name,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([duration]>=(3000000))),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
WHERE ([duration]>=(3000000)))
ADD TARGET package0.event_file(SET filename=N'SlowQueriesAndStatementsLargerThan3Seconds'),
ADD TARGET package0.ring_buffer …Run Code Online (Sandbox Code Playgroud) 我有一个我想要改进的程序,它使用这个 where 子句:
WHERE p.PlatformId = ISNULL(@PlatformId, p.PlatformId)
and p.PayeeStsId = 1
and p.PlatformPayeeId = ISNULL(@platformPayeeId, p.PlatformPayeeId)
and pba.PayeeBankStsId=1
and a.Gcid = ISNULL(@Gcid, a.Gcid)
Run Code Online (Sandbox Code Playgroud)
这ISNULL给我使用索引带来了问题,我怎样才能避免使用这种格式ISNULL?
p.PlatformId = ISNULL(@PlatformAccountId, p.PlatformId)
Run Code Online (Sandbox Code Playgroud)
这种格式导致执行计划进行索引扫描。
我正在尝试使用触发器捕获登录时间EVENTDATA()。但它只为所有类型的事件提供 Null 值。有人可以帮我解决这个问题吗?这是我的触发器
CREATE TRIGGER trgBlockIP
ON ALL SERVER
FOR LOGON
AS
BEGIN
DECLARE @clientip NVARCHAR(15);
SET @clientip = (
SELECT
EVENTDATA().value(
'(/EVENT_INSTANCE/Clienthost)[1]',
'NVARCHAR(15)'
)
);
IF EXISTS (
SELECT ip
FROM master.dbo.BLockedIPAddresses
WHERE ip = @clientip
)
BEGIN
PRINT 'Your IP Address is blocked';
ROLLBACK;
END;
ELSE
BEGIN
DECLARE @Range VARCHAR(15);
SELECT
@Range = SUBSTRING(
@clientip,
1,
LEN(@clientip)
- CHARINDEX('.', REVERSE(@clientip))
) + '.*';
IF EXISTS (
SELECT ip
FROM master.dbo.BLockedIPAddresses
WHERE ip = @Range
)
BEGIN …Run Code Online (Sandbox Code Playgroud)