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
相关产品推荐
相关产品推荐

