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几年,很多地方还是能够弥补你的知识空白.大师级的人物写基础知识,或许你想知道这基础中还有哪些深奥,敬请期待吧. ...
随机推荐
- win10的mysql服务无法启动
net start mysql 无法启动 1.可以进入MySQL的bin目录下 mysql --remove 2.检查一下自己的my.ini是否配置正确 [mysqld] #basedir代表自己My ...
- python如何转换word格式、读取word内容、转成html
# python如何转换word格式.读取word内容.转成html? import docx from win32com import client as wc # 首先将doc转换成docx wo ...
- Map 接口简明
Map 接口并没有继承Collection接口 HashMap : 哈希表数据结构,是线程不同步的,快速.允许存储 null 键,null 值.替代了 Hashtable. LinkedHashMap ...
- Linux64位程序中的漏洞利用
之前在栈溢出漏洞的利用和缓解中介绍了栈溢出漏洞和一些常见的漏洞缓解 技术的原理和绕过方法, 不过当时主要针对32位程序(ELF32). 秉承着能用就不改的态度, IPv4还依然是互联网的主导, 更何况 ...
- 【SQL.基础构建-第二节(2/4)】
-- Tips:查询基础 --一.SELECT 语句基础-- 1.查询指定列:SELECT 关键字--语法:--SELECT <列名>, ... -- 希望查询列的名称- ...
- DDD实战进阶第一波(六):开发一般业务的大健康行业直销系统(实现产品上下文仓储与应用服务层)
前一篇文章我们完成了产品上下文的领域层,我们已经有了关于产品方面的简单领域逻辑,我们接着来实现产品上下文关于仓储持久化与应用层的用例如何来协调 领域逻辑与仓储持久化. 首先大家需要明确的是,产品上下文 ...
- [Codeforces 933B]A Determined Cleanup
Description 题库链接 给你两个正整数 \(p,k\) ,询问是否能够构造多项式 \(f(x)=\sum\limits_{i=0}^{d-1}a_ix^i\) ,使得存在多项式 \(q(x) ...
- [SDOI2008]Sue的小球
题目描述 Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩蛋,Sue有一 ...
- [HNOI2004]树的计数
题目描述 输入输出格式 输入格式: 输入文件第一行是一个正整数n,表示树有n个结点.第二行有n个数,第i个数表示di,即树的第i个结点的度数.其中1<=n<=150,输入数据保证满足条件的 ...
- 贼有意思[最长上升公共子序列](SAC大佬测试题)
题目描述Awson 最近越来越蠢了,一天就只知道 zyys.他定义了一个 zyys 数列:这个数列满足:1.是另外两个数列 A,B 的公共子序列;2.数列单调递增.现在他有一个问题,我们假设知道两个长 ...