扩展事件捕获最少的事件以获得更好的性能
Extended events capture bare minimum events for better performance
我们有遗留应用程序,有很多用户连接到我们的遗留系统。我们了解我们的工作和我们的数据库维护活动。但是,我们看到很多不同的用户也在访问生产系统。我们想要捕获最少的扩展事件,以查看不同的第三方用户是什么以及他们正在 运行 进行哪些查询。
我们的扩展事件会话当前配置:
我们添加了以下活动。我们在服务器中为我们的数据库应用了过滤器。我们正在写入 5 GB 限制的磁盘文件目标并回收文件,以避免文件系统膨胀。
- module_end(附加事件字段:语句)
- rpc_completed(附加事件字段:语句)
- sql_batch_completed(附加事件字段:批处理文本)
我们正在捕获以下全局字段。
- client_app_name
- database_id
- nt_username
- sql 文字
- 用户名
但是,对于生产系统来说,即使是上面的那个也是压倒性的。因此,我们正在努力减少捕获量。
我们针对最小扩展事件捕获的计划更改:
- 除了数据库过滤器之外,应用过滤器从事件捕获中删除已知用户
- 只需捕获 rpc_completed、sql_batch_completed 个事件
- 只需捕获 client_app_name、database_id、用户名全局字段,因为我们可以从事件字段中获取 sql 语句:statement
我们的问题:
请建议我们是否在最小配置模式下配置了我们的扩展事件会话。或者您是否建议对活动会话进行更多更改。
感谢您的帮助。
更新:我们的修改脚本供参考
ALTER EVENT SESSION [Audit_UserActivities] ON SERVER
DROP EVENT sqlserver.module_end, DROP EVENT sqlserver.rpc_completed, DROP EVENT sqlserver.sql_batch_completed
ALTER EVENT SESSION [Audit_UserActivities] ON SERVER
ADD EVENT sqlserver.rpc_completed(
ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.username)
WHERE (([sqlserver].[like_i_sql_unicode_string]([sqlserver].[database_name],N'DBPrefix%')) OR (([sqlserver].[equal_i_sql_unicode_string]([sqlserver].[database_name],N'DBName')) AND ([sqlserver].[username]<>N'DBSysadminUser')))), ADD EVENT sqlserver.sql_batch_completed(SET collect_batch_text=(1)
ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.username)
WHERE (([sqlserver].[like_i_sql_unicode_string]([sqlserver].[database_name],N'DBPrefix%')) OR (([sqlserver].[equal_i_sql_unicode_string]([sqlserver].[database_name],N'DBName')) AND ([sqlserver].[username]<>N'DBSysadminUser'))))
GO
我不希望您问题中带有文件目标的扩展事件会话通常对健康的服务器有影响。不过,您还应该考虑其他因素来减轻影响。
捕获 fixed in SQL Server 2016+ 的 TVP RPC 事件存在一个已知问题,包括 Azure SQL 数据库。我相信这个问题在旧版本中仍然存在,并且对于大型 TVP 来说成本非常高。您在 SQL Server 2012 中的资源是使用过滤器排除 TVP RPC 事件。
考虑指定更大的缓冲区大小(例如 MAX_MEMORY=100MB
,具体取决于您的实例内存)。还指定 ALLOW_MULTIPLE_EVENT_LOSS
,以减轻跟踪对高频事件工作负载的影响,因为此跟踪方案可以接受一些事件丢失。
我们有遗留应用程序,有很多用户连接到我们的遗留系统。我们了解我们的工作和我们的数据库维护活动。但是,我们看到很多不同的用户也在访问生产系统。我们想要捕获最少的扩展事件,以查看不同的第三方用户是什么以及他们正在 运行 进行哪些查询。
我们的扩展事件会话当前配置:
我们添加了以下活动。我们在服务器中为我们的数据库应用了过滤器。我们正在写入 5 GB 限制的磁盘文件目标并回收文件,以避免文件系统膨胀。
- module_end(附加事件字段:语句)
- rpc_completed(附加事件字段:语句)
- sql_batch_completed(附加事件字段:批处理文本)
我们正在捕获以下全局字段。
- client_app_name
- database_id
- nt_username
- sql 文字
- 用户名
但是,对于生产系统来说,即使是上面的那个也是压倒性的。因此,我们正在努力减少捕获量。
我们针对最小扩展事件捕获的计划更改:
- 除了数据库过滤器之外,应用过滤器从事件捕获中删除已知用户
- 只需捕获 rpc_completed、sql_batch_completed 个事件
- 只需捕获 client_app_name、database_id、用户名全局字段,因为我们可以从事件字段中获取 sql 语句:statement
我们的问题: 请建议我们是否在最小配置模式下配置了我们的扩展事件会话。或者您是否建议对活动会话进行更多更改。
感谢您的帮助。
更新:我们的修改脚本供参考
ALTER EVENT SESSION [Audit_UserActivities] ON SERVER
DROP EVENT sqlserver.module_end, DROP EVENT sqlserver.rpc_completed, DROP EVENT sqlserver.sql_batch_completed
ALTER EVENT SESSION [Audit_UserActivities] ON SERVER
ADD EVENT sqlserver.rpc_completed(
ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.username)
WHERE (([sqlserver].[like_i_sql_unicode_string]([sqlserver].[database_name],N'DBPrefix%')) OR (([sqlserver].[equal_i_sql_unicode_string]([sqlserver].[database_name],N'DBName')) AND ([sqlserver].[username]<>N'DBSysadminUser')))), ADD EVENT sqlserver.sql_batch_completed(SET collect_batch_text=(1)
ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.username)
WHERE (([sqlserver].[like_i_sql_unicode_string]([sqlserver].[database_name],N'DBPrefix%')) OR (([sqlserver].[equal_i_sql_unicode_string]([sqlserver].[database_name],N'DBName')) AND ([sqlserver].[username]<>N'DBSysadminUser'))))
GO
我不希望您问题中带有文件目标的扩展事件会话通常对健康的服务器有影响。不过,您还应该考虑其他因素来减轻影响。
捕获 fixed in SQL Server 2016+ 的 TVP RPC 事件存在一个已知问题,包括 Azure SQL 数据库。我相信这个问题在旧版本中仍然存在,并且对于大型 TVP 来说成本非常高。您在 SQL Server 2012 中的资源是使用过滤器排除 TVP RPC 事件。
考虑指定更大的缓冲区大小(例如 MAX_MEMORY=100MB
,具体取决于您的实例内存)。还指定 ALLOW_MULTIPLE_EVENT_LOSS
,以减轻跟踪对高频事件工作负载的影响,因为此跟踪方案可以接受一些事件丢失。