You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server 2016扩展事件如何过滤NULL值以减小.xel文件体积

在SQL Server 2016扩展事件中过滤NULL值事件的正确配置方法

在SQL Server 2016的扩展事件里,直接用IS NOT NULL或length()函数过滤sqlserver.nt_user这类字段为NULL的事件是无效的。要提前缩小.xel文件体积、避免事后查询耗时,得调整扩展事件的过滤条件写法。

扩展事件的谓词引擎对字符串类型的NULL值处理特殊:当字段为NULL时,会被视为空字符串。因此我们可以通过判断字段不等于空字符串来实现过滤。

修改后的完整事件会话创建代码如下:

CREATE EVENT SESSION [AuditLogins] ON SERVER 
ADD EVENT sqlserver.login (
    ACTION (
        sqlserver.client_app_name,
        sqlserver.client_hostname,
        sqlserver.database_name,
        sqlserver.nt_username,
        sqlserver.server_principal_name,
        sqlserver.username
    )
    WHERE 
    (
        sqlserver.session_nt_user <> N''
        AND sqlserver.username <> N''
        AND sqlserver.nt_user <> N''
    )
)
ADD TARGET package0.event_file (
    SET filename = N'D:\MySQLAudit\AuditLogins.xel',
        max_file_size = (50),
        max_rollover_files = (10)
)
WITH (
    MAX_MEMORY = 4096 KB,
    EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
    MAX_DISPATCH_LATENCY = 5 SECONDS,
    MAX_EVENT_SIZE = 0 KB,
    MEMORY_PARTITION_MODE = NONE,
    TRACK_CAUSALITY = OFF,
    STARTUP_STATE = ON
);
GO

ALTER EVENT SESSION [AuditLogins] ON SERVER STATE = START;
GO

如果需要更严谨的谓词判断,也可以使用扩展事件自带的package0.not_equal函数,写法如下:

WHERE 
(
    package0.not_equal(sqlserver.session_nt_user, N'')
    AND package0.not_equal(sqlserver.username, N'')
    AND package0.not_equal(sqlserver.nt_user, N'')
)

这两种写法都能有效过滤掉目标字段为NULL或空字符串的登录事件,从源头减少.xel文件的体积。

内容的提问来源于stack exchange,提问作者MegaCalkins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:32:40