位置: 编程技术 - 正文

SQLServer中使用扩展事件获取Session级别的等待信息及SQLServer 2016中Session级别等待信息的增强(sql扩展)

编辑:rootadmin

推荐整理分享SQLServer中使用扩展事件获取Session级别的等待信息及SQLServer 2016中Session级别等待信息的增强(sql扩展),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:sqlserver增加,sqlserver插数据,sqlserver插数据,sqlserver数据库扩容,sqlserver插数据,sqlserver增加,sqlserver增加,sqlserver扩展名,内容如对您有帮助,希望把文章链接给更多的朋友!

什么是等待

简单说明一下什么是等待:

当应用程序对SQL Server发起一个Session请求的时候,这个Session请求在数据库中执行的过程中会申请其所需要的资源,

比如可能会申请内存资源,表上的锁资源,物理IO资源,网络资源等等,

如果当前Session运行过程中需要申请的某些资源无法立即得到满足,就会产生等待。

SQL Server会以不用的方式来展现这个等待信息,比活动Session的等待信息,实例级的等待信息等等。

SQL Server中,等待事件是作为DBA进行TroubleShooting的重要参考信息之一,SQL Server中可以通过多中方式来获取等待信息。

但是对于SQL Server 之前的版本来说,不管是活动Session级别的等待和实例级的等待,参考意义都有限,

更多的时候是想要更加详细的且可以事后分析的等待,这就需要收集那些曾经已执行过的Session产生的等待信息,也就是特定Session等待信息的历史记录

本文重点介绍使用扩展事件来捕获等待信息,但不介绍扩展事件本身的使用,重点放在如何使用扩展事件来获取想要的等待事件信息。

需要对扩展事件有一定的了解。

等待信息的获取途径

在SQL Server中有一个系统视图sys.dm_os_wait_stats记录了自数据库服务启动以来累积产生的等待信息,

如下图,这个结果是实例级的,也就是记录的整个数据库服务器所有的等待事件的累积。

多数时候参考意义不是很大,比如某一天的网络延时很高,sys.dm_os_wait_stats中累计记录了大量的ASYNC_NETWORK_IO等待信息。

但是到了第二天或者什么时候,网络变好了,但是sys.dm_os_wait_stats中记录的ASYNC_NETWORK_IO等待信息是不变的

也就是说sys.dm_os_wait_stats无法反映实时等待情况。

当然要获取实时的等待信息也简单,记录两个时间点之间sys.dm_os_wait_stats中等待时间的差值,可以间接地反映出来某一段时间的数据的等待信息。

但是这个信息仍然比较粗略,依旧是实例级的,某些时候依旧是不足够作为参考的。

另外一个是通过sys.dm_exec_requests这个系统视图的wait_type,wait_time等获取活动Session的等待信息

如截图,但是这个是活动Session的信息,当Session完成之后,它的等待信息就看不到曾经都产生了那些等待,分别是多久。

也就说,你无法追溯历史上某一个Session或者某一个SQL(存储过程)执行过程中的都产生了什么类型的等待,等待了多长时间。

实话说,不管是sys.dm_os_wait_stats还是sys.dm_exec_requests,在正常情况下,获取到的等待信息实用价值都是不高或者是适用场景有限。

更多的时候我们是想要更细一级的等待,比如某一个Login、某一部分Session、甚至某些特定的SQL(存储过程)的执行过程中产生的等待信息。

举个实际例子,数据库又个Login给个不同的应用程序访问,其中只有1个应用程序端反馈说访问数据库慢,或者有性能问题,其他Login都反馈正常

那么很有可能是这个Login请求自己的问题,此时就需要针对这一个Login的情况进行针对性分析,而不是在实例级分析诊断。

如果能够拿到这个Login执行的Session的等待情况,或者这个Login某些特定的数据库对象的执行过程中的等待信息,对定位问题的针对性的就比较强了。

本文就以此为切入点,针对如何获取Session级别的等待信息展开说明和演示。

SQL Server 中获取Session级别的等待信息

在SQL Server 中,获取Session级别的等待信息是比较方便的,有直接的系统视图sys.dm_exec_session_wait_stats可以使用

当前情况下,想要知道某一个Session的等待信息就很简单了,

在sql语句开始的时候把当前Session的等待信息记录下来

在sql语句结束的时候把当前Session的等待信息再次记录出来

计算两次等待信息的差值,就可以知道当前Session运行的过程中有哪些等待,分别是多少。

  sqlserver开发团队可能也意识到了对于等待信息,更多的时候,需要的是较为具体的等待,而不是一个笼统的实例级的等待

  因此在SQL Server 中增加了sys.dm_exec_session_wait_stats这个支持统计Session级别的等待的视图

  很不幸的SQL Server之前的版本中是没有这个系统视图可以很方便地记录Session级别的等待。

  但是可以借助扩展事件来实现类似的功能。

使用扩展事件来捕获Session级别的等待信息

因为这里是是用扩展事件来实现的,这里要求读者要对扩展事件有一个基本的认识,扩展事件本身就不多说了。

SQLServer中使用扩展事件获取Session级别的等待信息及SQLServer 2016中Session级别等待信息的增强(sql扩展)

上代码,启动一个扩展事件,来记录执行时间超过三秒的SQL语句,其执行过程中等待时间大于0的等待事件信息。

当然这个捕获的信息可以加上各种过滤条件。具体参考代码备注。

是用扩展事件收集的Session级别的等待信息有以下几个特点

1,SessionId是可以重复的

  举例说明就是:比如一个SessionId = 的Session,可以第一次执行一个SQLA,第二次执行一个SQLB.

  同时这两个SQL的执行与其执行过程中产生的等待信息都可以被捕获出来

2,同一个时间段内,一个同一个SessionId不可能同时执行,

  比如::秒到::秒到这个时间内,SessionId = 的Session正在执行,扩展事件捕获到了其产生的等待信息

  但是在::秒到::这个时间段内,不可能有另外一个SessionId = 也在执行,这个逻辑不难理解

为什么要特意说明这个问题?

因为扩展事件收集到的事件信息中SQL语句完成事件(rpc_completed或者sql_batch_completed)与产生的等待之间,没有一个直接的对应关系。

怎么理解?动起手来才能发现问题,我是这个纠结了大半天,截图示例。

如下截图,扩展事件捕获到的两个目标事件的SessionId都是,但是执行的SQL是不一样的,

如下截图是不区分事件类型,捕获到的所有的事件信息。

也就是上面说的,对于号Session:

第一次运行了SELECT COUNT(1) FROM TestCollectionSessionWaitStats

第二次运行了SELECT COUNT(1) FROM TestCollectionSessionWaitStats WHERE Id>

两次运行的SQL一致或者不一致问题不大,关键是捕获到的等待事件信心的SessionId也是,怎么区分产生的事件是归属于哪一次的运行?

比如号Session运行两次sql,产生了条等待信息,怎么区分这条等待信息哪些归属于第一次运行生成的,哪些归属于第二次运行生成的?

这个就依靠上面说的第二点“同一个时间段内,一个同一个SessionId不可能同时执行”

对于同一个SessionId,在sql_batch_completed事件中,从时间的维度来看

小于第一次sql_batch_completed事件完成时间的必然是号Session第一次执行生成的

大于第一次sql_batch_completed事件完成事件的且小于第二次sql_batch_completed的必然是号Session第二次执行生成的

有了这个理论基础,我们统计Session级别的等待就比较容易了,相信这个逻辑的实现并不难。

如下图是号Session执行某SQL语句产生的等待详细信息,可以看到多次产生了CXPACKET和 PAGEIOLATCH_SH等待

鉴于截图问题,下面还有另外一个同样是号Session的执行另外一个SQL捕获到的等待信息

这个统计办法就是上面提到的,在两次sql_batch_completed事件中,虽然等待事件的SessionId一样,

但是其发生的时候是处于当前事件的sql_batch_completed之前,上一次sql_batch_completed之后,

这样就可以完美地匹配到sql_batch_completed事件与其对应的wait_info事件。

在这种情况下,统计得到类似于SQL Server 中的sys.dm_os_wait_stats的结果也就不难了。

与sys.dm_os_wait_stats 等待信息的结果相比,上述通过扩展事件获取的等待信息,是不是更加详细和具体?

比如对于CXPACKET等待时间,

不难发现,如果计算计算其产生的次数(count),就类似于sys.dm_os_wait_stats 中的waiting_tasks_count,计算其产生的总时间(sum),就类似于wait_time_ms

但是上述时间的信息已经细化到Session级别了,比sys.dm_os_wait_stats 中的等待信息更有参考价值。对于问题的诊断和分析,也会是更加有效。

上述统计结果的SQL语句

当然该语句仅供参考,目的是为了收集Session级的统计信息,当收集到Session级别的统计信息之后,具体的统计方式也不难。

总结

   等待事件可以帮助我们诊断SQL Server上的一些资源瓶颈,对于问题的处理和解决有着比较重要的参考意义,如果能够细化地收集等待事件,对于解决问题的参考意义会更大。

   本文通过一个简单的示例,使用扩展事件来收集SQL Server中一些特定场景下的等待信息,来更加有针对性地进行问题的诊断和识别,使得问题的分析更加高效和具有针对性。

以上所述是小编给大家介绍的SQLServer中使用扩展事件获取Session级别的等待信息及SQLServer 中Session级别等待信息的增强,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对积木网网站的支持!

Sql Server临时表和游标的使用小结 1.临时表临时表与永久表相似,但临时表存储在tempdb中,当不再使用时会自动删除。临时表有局部和全局两种类型2者比较:局部临时表的名称以符号(#)打

SQL查询方法精华集 一、简单查询简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。例如,下面的语

SQLServer存储过程创建和修改的实现代码 打开SQLServer的管理工具,选中需要创建存储过程的数据库,找到可编程性,展开后可以看到存储过程。右键点击它,选择新建存储过程,右侧的编辑

标签: sql扩展

本文链接地址:https://www.jiuchutong.com/biancheng/324395.html 转载请保留说明!

上一篇:Sql Server数据库各版本功能对比(sql server数据库恢复)

下一篇:Sql Server临时表和游标的使用小结(sql server临时表的生命周期)

  • 长期股权投资产生的投资收益属不属于非经常性损益
  • 法人拿走公司利润要交税吗
  • 有限合伙企业应当
  • 作废冲红的发票怎么做账处理
  • 小规模纳税人增值税起征点
  • 跨境电商有进口吗
  • 收到实收资本要交什么税
  • 境外企业国内签订合同如何缴纳印花税?
  • 企业临时账户是什么意思
  • 抵扣上月留抵税额的分录
  • 培训相关的场地租赁费可以列入职工教育经费税前扣除吗?
  • 没有签字的支出凭证怎么处理?
  • 取得虚开增值税专用发票罪量刑标准
  • 过路费是地税还是国税
  • 补记以前年度收入在报表中怎么处理
  • 应交增值税减免税额期末需要结转吗
  • 转出未交增值税怎么算
  • 商品房房产税征收标准
  • 广告制作费属于现代服务吗
  • 哪些情况需要变更船籍港
  • 生物性资产是什么
  • 视同销售产品与收款尾差怎么处理
  • 小规模纳税人怎么开增值税专用发票
  • 电子发票开给个人怎么处理?
  • 土地增值税进项税
  • 上月的应付账款怎么记账
  • 厦门新车购置税计算
  • 清理血管垃圾最有效的食物
  • 苹果14promax电池掉电很快
  • PHP:mb_regex_encoding()的用法_mbstring函数
  • php随机生成1到3的数字
  • quicklylook
  • 补充养老保险税收规定扣除率
  • 汇总收款凭证怎么做账
  • 企业停产免征房产税
  • source map
  • element动态变化表格列
  • 在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
  • 增值税注明的价款是含税还是不含税
  • php获取当前页面url
  • javaweb项目登录页面不跳转
  • three.js如何给模型锚点
  • js实现功能
  • 【机器学习】前置知识:矩阵的表示与定义 | Identity 身份矩阵 | 逆矩阵和转置 | 标量乘法
  • 存货盘盈盘亏的会计处理
  • 其他综合收益是利润表项目吗
  • 纳税证明和完税证明的金额为什么不一样
  • 免税票如何做会计分录
  • 出售无形资产损益怎么算
  • phpcms api
  • 现金周期和经营周期的计算公式
  • 差旅费属于什么支出类型
  • 建筑工程审计流程
  • 支付水电费的会计
  • 美容行业如何做好管理工作
  • mysql 5.7 8.0
  • mysql删除重复字段
  • cvi linux
  • 2t硬盘如何分区最合理
  • 苹果电脑截图快捷键
  • 格式化快速格式化好吗
  • Win10预览版桌面图标和任务栏不翼而飞怎么办?
  • windowsxp入门
  • mmtraylsi.exe是什么进程 有什么作用 mmtraylsi进程查询
  • 远程电脑屏幕桌面图标什么都没有了
  • ubuntu系统启动流程
  • win8怎么打开桌面
  • css动态网页
  • osg uniform
  • html和js如何应用
  • unity3d制作ui
  • python将结果写入excel
  • node.js怎么用
  • javascript基础笔记
  • android4.4w
  • jquery详解
  • javascript面向对象精要pdf
  • 第三届一带一国际高峰论坛
  • 日本快递税率
  • 如何查到银行
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设