SQL Server 扩展事件(Extented Events)从入门到进阶(4)——扩展事件引擎——基本概念
本文属于 SQL Server 扩展事件(Extented Events)从入门到进阶 系列
在第一二节中,我们创建了一些简单的、类似典型SQL Trace的扩展事件会话。在此过程中,介绍了很多扩展事件基础组件,包括事件、谓词、操作和目标。本节,将对扩展事件引擎、架构和基本组件做更加深入的了解。通过这些讲解,可以大概了解到为什么扩展事件相对于SQL Trace来说更加低开销。另外,还会延时如何设计事件会话从而最小化事件收集过程中的不必要开销,即使这些事件会话会很复杂。
事件数据收集生命周期:
- 收集事件的基本负载数据。
- 评估谓词
- 如果谓词为True则收集对应操作。
- 直接分派事件数据到所有同步目标或者到中间内存缓冲区等待分派到异步目标。
- 最小化在默认负载(相对于Trace这种收集事件所有列而言)中收集的事件列数。
- 在事件数据采集之前使用谓词预先过滤掉不必要的数据。
- 通过先进的预聚合(pre-aggregating)可用性目标有时候可以显著降低引擎可能需要收集的数据总量。
扩展事件引擎基础架构:
模组和包(Modules and Packages):
SELECT [p].[name] AS [Module] ,[p].[description] AS [Description] ,[m].[name] AS [ModulePath]FROM [sys].[dm_xe_packages] [p]JOIN [sys].[dm_os_loaded_modules] [m]ON [p].[module_address] = [m].[base_address];GO
SELECT [xo].[name] AS [EventName] , [xo].[description] AS [EventDescription] , [xp].[name] AS [Package] FROM [sys].[dm_xe_objects] [xo] JOIN [sys].[dm_xe_packages] [xp] ON [xo].[package_guid] = [xp].[guid] WHERE [xo].[object_type] = N'event' ORDER BY [xo].[name]; GO
事件:
SELECT [object_name] AS [EventName] ,[name] AS [ElementName] ,[column_id] AS [ColumnID] ,[type_name] AS [ElementType] ,[column_type] AS [ColumnType] ,[capabilities_desc] AS [Capability] ,[description] AS [ElementDescription]FROM [sys].[dm_xe_object_columns]WHERE [object_name] = N'sql_statement_completed'AND [column_type] <> 'readonly';GO
操作:
SELECT [xp].[name] AS [Package] ,[xo].[name] AS [Action] ,[xo].[description] AS [Description]FROM [sys].[dm_xe_packages] AS [xp]JOIN [sys].[dm_xe_objects] AS [xo]ON [xp].[guid] = [xo].package_guidWHERE ( [xp].[capabilities] IS NULLOR [xp].[capabilities] & 1 = 0)AND ( [xo].[capabilities] IS NULLOR [xo].[capabilities] & 1 = 0)AND [xo].[object_type] = 'action';GO
谓词:
CREATE EVENT SESSION [MyEventSession] ON SERVERADD EVENT sqlserver.sp_statement_completed ( SET collect_object_name = ( 1 ) ,collect_statement = ( 1 )ACTION ( sqlserver.client_app_name, sqlserver.database_name )WHERE ( [logical_reads] >= ( 10000 ) ) );GO
SELECT [object_name] AS [Event], [name] AS [Column], [description] AS [Description] FROM [sys].[dm_xe_object_columns] WHERE [name] = 'duration' ORDER BY [object_name];
CREATE EVENT SESSION [MyEventSession] ON SERVER ADD EVENT sqlserver.sp_statement_completed ( SET collect_object_name = ( 1 ) , collect_statement = ( 1 ) ACTION ( sqlserver.client_app_name, sqlserver.database_name ) WHERE ( [sqlserver].[database_id] = ( 7 ) AND [logical_reads] >= ( 10000 ) AND [duration] >= ( 1000 ) ) ); GO
映射(Maps):
SELECT [xmv].[name] , [xmv].[map_key] , [xmv].[map_value] FROM sys.dm_xe_map_values [xmv] JOIN sys.dm_xe_packages [xp] ON [xmv].[object_package_guid] = [xp].[guid] WHERE [xmv].[name] = N'wait_types'; GO
CREATE EVENT SESSION [Capture WRITELOG Waits] ON SERVER ADD EVENT sqlos.wait_info ( WHERE ( ( [wait_type] = ( 181) ) AND ( [duration] >= ( 1000 ) ) ) ) ADD TARGET package0.event_file ( SET filename = N'C:\temp\WaitInfo' ); GO
目标:
- event_file:类似SQL Trace中的Trace文件的文件系统目标,在事件会话结束后固化到硬盘中。
- ring_buffer:使用FIFO(First In First Out,先进先出)算法,把数据驻留在内存存储中。
- event_counter:在内存中,每个事件会话中的事件出现频率数。
- histogram:在内存中的目标,产生一个关于事件发生的柱状图,关于所有常用事件的每个数据列或者操作,或者一个特定事件或者操作的一列的信息。
- pair_matching:在内存中,匹配目标的开始和结束事件,只保留没有配对的那些事件(比如有事务开始事件,没有事务结束事件)
event_file:
ring_buffer:
Event_counter:
Histogram:
这个目标在SQL 2008/2008R2中称为“bucketizer”,因为它基于选择的元素进行分组,比如你想知道为什么语句重编译,可以使用下面语句捕获:
CREATE EVENT SESSION [Capture WRITELOG Waits] ON SERVER ADD EVENT sqlos.wait_info ( WHERE ( ( [wait_type] = ( 181 ) ) AND ( [duration] >= ( 1000 ) ) ) ) ADD TARGET package0.event_file ( SET filename = N'C:\temp\WaitInfo' ); GO CREATE EVENT SESSION [TrackRecompiles] ON SERVER ADD EVENT sqlserver.sql_statement_recompile ( SET collect_object_name = ( 1 ) , collect_statement = ( 1 ) WHERE ( [sqlserver].[is_system] = ( 0 ) ) ) ADD TARGET package0.histogram ( SET filtering_event_name = N'sqlserver.sql_statement_recompile' , slots = ( 11 ) , source = N'recompile_cause' , source_type = ( 0 ) ) 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 = OFF , STARTUP_STATE = OFF ); GO
Pair_matching:
CREATE EVENT SESSION [Find_Unmatched_Statements] ON SERVER ADD EVENT sqlserver.sql_statement_starting ( ACTION ( sqlserver.session_id, sqlserver.tsql_stack ) ), ADD EVENT sqlserver.sql_statement_completed ( ACTION ( sqlserver.session_id, sqlserver.tsql_stack ) ) ADD TARGET package0.pair_matching ( SET begin_event = N'sqlserver.sql_statement_starting' , begin_matching_actions = N'sqlserver.session_id, sqlserver.tsql_stack' , end_event = N'sqlserver.sql_statement_completed' , end_matching_actions = N'sqlserver.session_id, sqlserver.tsql_stack' , respond_to_memory_pressure = ( 0 ) ) 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 = OFF , STARTUP_STATE = OFF ); GO
总结:
- 如非必要不要添加事件。
- 不要添加不必要的操作。
- 在谓词中使用短路逻辑最小化数据收集的开销,特别在收集大量事件,并且事件被频繁触发,或采集的事件本身就是高开销的。
- 根据目的选择必要的目标,并且考虑存储时效。
SQL Server 扩展事件(Extented Events)从入门到进阶(4)——扩展事件引擎——基本概念的更多相关文章
- 《SQL Server 2012 T-SQL基础》读书笔记 - 7.进阶查询
Chapter 7 Beyond the Fundamentals of Querying window function是什么呢?就是你SELECT出来一个结果集,然后对于每一行,你都想给它对应一个 ...
- SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events
由于工作需要,决定深入研究SQL Server的扩展事件(Extended Events/xEvents),经过资料搜索,发现国外大牛的系列文章,作为“学习”阶段,我先翻译这系列文章,后续在工作中的心 ...
- SQL Server Extended Events 进阶 2:使用UI创建基本的事件会话
第一阶中我们描述了如何在Profiler中自定义一个Trace,并且让它运行在服务器端来创建一个Trace文件.然后我们通过Jonathan Kehayias的 sp_SQLskills_Conver ...
- 使用WinDbg调试SQL Server——入门
这篇文章我想探究下SQL Server里完全不同的领域:如果使用WinDbg(来自针对Windows的调试工具)调试SQL Server.在我们进入枯涩细节之前,我想详细解释下为什么选择这样晦涩的话题 ...
- 数据库技术丛书:SQL Server 2016 从入门到实战(视频教学版) PDF
1:书籍下载方式: SQL Server2016从入门到实战 PDF 下载 链接:https://pan.baidu.com/s/1sWZjdud4RosPyg8sUBaqsQ 密码:8z7w 学习 ...
- SQL Server Extended Events 进阶 1:从SQL Trace 到Extended Events
http://www.sqlservercentral.com/articles/Stairway+Series/134869/ SQL server 2008 中引入了Extended Events ...
- SQL Server 事件通知(Event notifications)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 事件通知监控DDL(NotifyQue ...
- SQL Server 2014里的缓存池扩展
在今天的文章里我想谈下SQL Server 2014里引入的缓存池扩展(Buffer Pool Extensions).我们都知道,在SQL Server里,缓存池是主要的内存消耗者.当你从你存储里读 ...
- 【转】Microsoft® SQL Server® 2012 Performance Dashboard Reports
http://www.cnblogs.com/shanyou/archive/2013/02/12/2910232.html SQL Server Performance Dashboard Repo ...
- [置顶] 图书推荐:SQL Server 2012 T-SQL基础 Itzik Ben-Gan
经过近三个月的不懈努力,终于翻译完毕了.图书虽然是基础知识,但是,即使你已经使用T-SQL几年,很多地方还是能够弥补你的知识空白.大师级的人物写基础知识,或许你想知道这基础中还有哪些深奥,敬请期待吧. ...
随机推荐
- python常用的一些东西——sys、os等(转)
1.常用内置函数:(不用import就可以直接使用) help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像函数一样调用 ...
- html如何实现的
超文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分.网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览器如何显示其中的 ...
- RPC服务和HTTP服务
很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单 ...
- Docker配置加速器
我们国内使用官方Docker Hub仓库实在是太慢了,很影响效率 使用命令编辑文件: vim /etc/docker/daemon.json 加入下面的数据: docker-cn镜像: { " ...
- 手动导入xmpp后,再使用cocoapods的时候出现的问题
最新的cocoapod导入xmpp的时候,会出现循环依赖,所以撸主选择了手动导入. 一开始还用的挺开心的,后来,使用cocoapods导入其他的框架,发现调用的时候总是报错. Undefined sy ...
- MySQL的安全机制
MySQL的安全机制: 1.MySQL登录 mysql -u账户 -p密码 -h127.0.0.1 -P端口 数据库名 mysql -h hostname|hostIP -p port -u user ...
- shell入门笔记2:字符串、数组、echo与printf
说明: 本文是关于http://c.biancheng.net/cpp/shell/的相关笔记 shell字符串 字符串可以用单引号,也可以用双引号,也可以不用引号. 1 #!/bin/bash 2 ...
- python 网络爬虫(一)爬取天涯论坛评论
我是一个大二的学生,也是刚接触python,接触了爬虫感觉爬虫很有趣就爬了爬天涯论坛,中途碰到了很多问题,就想把这些问题分享出来, 都是些简单的问题,希望大佬们以宽容的眼光来看一个小菜鸟
- bzoj 5212: [Zjoi2018]历史
Description 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的小说,这本小说的架空世界引起了她的兴趣. 这个世界有n个城市,这n个城市被恰好n?1条双向道路联通,即任意两个城 ...
- C++Primer学习——函数
编译器能以任意顺序对形参进行求值 函数的返回类型不能是数组类型和函数类型. 函数开始时为形参分配内存,一旦函数结束,形参也就被销毁了. 如果弄成静态局部变量,那么回到程序终止结束时才被销毁. void ...