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几年,很多地方还是能够弥补你的知识空白.大师级的人物写基础知识,或许你想知道这基础中还有哪些深奥,敬请期待吧. ...
随机推荐
- PyQuery用法详解
PyQuery是强大而又灵活的网页解析库,如果你觉得正则写起来太麻烦,如果你觉得BeautifulSoup语法太难记,如果你熟悉jQuery的语法 那么,PyQuery就是你绝佳的选择. 一.初始化方 ...
- 20180117MySQL出现Waiting for table metadata lock的原因以及解决方法
转自http://www.cnblogs.com/digdeep/p/4892953.html 转自:http://ctripmysqldba.iteye.com/blog/1938150 (有修改) ...
- 创建第一个Django项目
第一个Django项目 命令行下使用如下命令创建一个名为"mysite"的Django项目: django-admin startproject mysite 这将会在当前位置创建 ...
- CentOS 7 快速初始化脚本 for MySQL
#!/bin/bash## CentOS 7.x # SSH configuresshd_port=22 # Disable SElinuxprintf "Disable SElinux.. ...
- Lua版组合算法
高效率的排列组合算法--<编程珠矶>--Lua实现 原文链接 原文是python实现的,这里给出lua版本的实现 组合算法 本程序的思路是开一个数组,其下标表示1到m个数,数组元素 ...
- Python中if __name__ == "__main__": 的理解
1.在很多python脚本中在最后的部分会执行一个判断语句if __name__ == "__main__:",之后还可能会有一些执行语句.那添加这个判断的目的何在? 在pytho ...
- [C#]设计模式-简单工厂-创建型模式
在设计模式当中有三大工厂,分别是 简单工厂.抽象工厂.工厂方法 这三种创建实例的设计模式,这里先从简单工厂将其,从名字就可以看出这是这三种工厂模式当中最为简单的一种实现. 简单工厂一般由以下几个对象组 ...
- 【Swift】图文混排,ios开发中在textfield或textView中插入图片
在ios开发中,我们一般都是在textfield或者textView中输入文字.当我们需要插入图片的时候其实也是很简单的 我们需要利用的textfield,textView的属性化文本,将图片以附件的 ...
- 实验吧_天下武功唯快不破&让我进去(哈希长度拓展攻击)
天下武功唯快不破 第一反应就去抓包,看到返回包的header中有FLAG的值,base64解码后得到下图所示 这就要求我们在请求头中post相应key的值,我直接在burp中尝试了多次都没有用,想起来 ...
- 领域驱动设计(DDD)笔记(一)
最近在看<领域驱动设计>这本书,准备写点学习笔记博文记录系列.记录本书中的要点和疑惑,不定期更新!先放张MarginNote的图: Aggregate 每个Aggregate 都有一 ...