通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?

原文:通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?

问题就是,一个很简单的语句,在不同的服务器上执行,所需要的时间相差很大,特别提到在性能差的服务器上反而快,在性能好的服务器上反而慢,他想知道这是为什么?

对这个问题,我的回答是:

从表面看,很难分析出为什么多台机器执行同一个简单的sql语句,速度有差异,甚至好的服务器反而花了更多的时间,而看上去相对较差的机器反而更快,这些都是表面现象。

我们可以分析一下整个SQL语句执行的大致过程:

1、语句发送到SQL Server服务器端。

2、SQL Server会找这个语句是否已经缓存在内存中,如果能找到,这样就不用重新编译,这样就会节省时间。

如果不在缓存中,那么就需要经过语法检查、语义检查、权限检查、编译,这个过程需要内存;再进行优化,生成执行计划,优化时也需要内存;然后把这个执行计划放进行缓存,这个也需要内存。

3、在执行的时候,如果所要访问的数据都在内存,也就是数据也缓存在内存中了,那么就不用从硬盘读取数据,也就是没有物理IO,只有逻辑操作,速度也会快。

4、在执行的时候,需要申请相关锁,如果所要访问的数据上已经加了锁,那么需要等待。

5、上面几点中,还有一个问题是,系统的负载,如果系统本来就很忙,那么上面的整个过程,可能任何一步,都有可能会等待一会。另外,内存和IO非常重要,如果你的系统存在内存压力,此外,磁盘经常满负荷运转,那么计算是执行一个简单的语句,也会比负载比较低时慢。

你的开发机器和你的服务器,负载是否一样。

6、非常重要的一点,语句运行完成后的结果集,通过网络发送到客户端程序,所以网络是否通畅以及速度的快慢,决定了你的语句的快慢。

对比,你的多张图片,之所以慢的原因应该不是在分析编译、执行时的cpu时间,而是执行时的占用时间,应该是花在IO上的,扫描次数和逻辑读取次数都一样,lob的逻辑读取差了2个,lob预读次数一样,很有可能就是这点差别,当然还有系统的负载,也会导致从硬盘读数据变慢。

另外,如果是直接连接远程,可能会有网络问题,如果是像你上面,直接通过远程连接登录到数据库服务器,再直接连数据库,那么应该不是网络的问题。

下面通过 这个帖子所描述的方法: http://blogs.msdn.com/b/sqlsakthi/archive/2011/02/20/sql-query-slowness-troubleshooting-using-extended-events-wait-info-event.aspx

通过扩展事件来跟踪一个语句,在运行时到底把时间消耗在哪儿了,比如说是PAGEIOLATCH_EX。

1、建立扩展事件,注意下面的session_id为你要跟踪的语句的会话id,要改过来。


  1. -- *** Change the Session ID values as per your need ***
  2. -- Check for existing session
  3. IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name=‘Waits_of_Particular_Session‘)
  4. DROP EVENT session Waits_of_Particular_Session ON SERVER;
  5. GO
  6. -- Create a session and add events and actions
  7. CREATE EVENT SESSION Waits_of_Particular_Session
  8. ON SERVER
  9. ADD EVENT sqlserver.sql_statement_starting
  10. (
  11. ACTION (sqlserver.session_id,
  12. sqlserver.sql_text,
  13. sqlserver.plan_handle)
  14. WHERE
  15. sqlserver.session_id > 52 AND sqlserver.session_id < 54
  16. ),
  17. ADD EVENT sqlos.wait_info
  18. (
  19. ACTION (sqlserver.session_id,
  20. sqlserver.sql_text,
  21. sqlserver.plan_handle)
  22. WHERE
  23. sqlserver.session_id > 52 AND sqlserver.session_id < 54
  24. ),
  25. ADD EVENT sqlos.wait_info_external
  26. (
  27. ACTION (sqlserver.session_id,
  28. sqlserver.sql_text,
  29. sqlserver.plan_handle)
  30. WHERE
  31. sqlserver.session_id > 52 AND sqlserver.session_id < 54
  32. ),
  33. ADD EVENT sqlserver.sql_statement_completed
  34. (
  35. ACTION (sqlserver.session_id,
  36. sqlserver.sql_text,
  37. sqlserver.plan_handle)
  38. WHERE
  39. sqlserver.session_id > 52 AND sqlserver.session_id < 54
  40. )
  41. ADD TARGET package0.asynchronous_file_target
  42. (SET filename=N‘C:\Temp\Waits_of_Particular_Session.xel‘)
  43. WITH (MAX_DISPATCH_LATENCY = 5 SECONDS, EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS, TRACK_CAUSALITY=ON)
  44. GO
  45. -- Start the Session
  46. ALTER EVENT SESSION Waits_of_Particular_Session ON SERVER
  47. STATE = START
  48. GO
  49. -- Run the query from the SPID
  50. -- Code to stop the session once the query execution completes
  51. ALTER EVENT SESSION Waits_of_Particular_Session ON SERVER
  52. STATE = STOP
  53. GO

2、然后,运行你的语句:select  *  from  dbo.ttt

3、最后,运行下面的语句,获取各类操作所消耗的时间:


  1. -- Parse the XML to show wait details
  2. SELECT
  3. event_xml.value(‘(./@name)‘, ‘varchar(1000)‘) as Event_Name,
  4. event_xml.value(‘(./data[@name="wait_type"]/text)[1]‘, ‘nvarchar(max)‘) as Wait_Type,
  5. event_xml.value(‘(./data[@name="duration"]/value)[1]‘, ‘int‘) as Duration,
  6. event_xml.value(‘(./data[@name="opcode"]/text)[1]‘, ‘varchar(100)‘) as Operation,
  7. event_xml.value(‘(./action[@name="session_id"]/value)[1]‘, ‘int‘) as SPID,
  8. event_xml.value(‘(./action[@name="sql_text"]/value)[1]‘, ‘nvarchar(max)‘) as TSQLQuery,
  9. event_xml.value(‘(./action[@name="plan_handle"]/value)[1]‘, ‘nvarchar(max)‘) as PlanHandle
  10. FROM
  11. (SELECT CAST(event_data AS XML) xml_event_data FROM sys.fn_xe_file_target_read_file(‘C:\Temp\Waits_of_Particular_Session*.xel‘, ‘C:\Temp\Waits_of_Particular_Session*.xem‘, NULL, NULL)) AS event_table
  12. CROSS APPLY xml_event_data.nodes(‘//event‘) n (event_xml)
  13. WHERE
  14. event_xml.value(‘(./@name)‘, ‘varchar(1000)‘) IN (‘wait_info‘,‘wait_info_external‘)
  15. -- Code to drop the session
  16. DROP EVENT SESSION Waits_of_Particular_Session ON SERVER;

这段监控的语句,在网友的服务器上执行,最后发现,时间主要消耗在了NETWORK_IO上,也就是网络。


不想长大啊

发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

他的留言板
关注

原文地址:https://www.cnblogs.com/lonelyxmas/p/12019951.html

时间: 2024-11-08 03:25:19

通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?的相关文章

SQL Server 2012笔记分享-33:SQL Server profiler跟踪

需求 使用SQL server profiler跟踪当前实例的所有常见活动,并将结果保存到文件中. ================================================================ 开始程序中选择SQL server profiler,如图. 选择文件--新建跟踪,如图. 连接到当前的SQL server实例,如图. 在跟踪属性里面配置跟踪名称.保存到的文件地址.保存到SQL报表.启用跟踪停止时间等,如图. 下图是一个跟踪启动后实时的跟踪情况,如图

SQL Server 2012笔记分享-1:SQL Server版本的演变

SQL是英文Structured Query Language的缩写,意思为结构化查询语言.SQL语言的主要功能就是同各种数据库建立联系,进行沟通.按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言.SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等.目前,绝大多数流行的关系型数据库管理系统,如Oracle, Sybase, Microsoft SQL Server, Access等都采用了SQL语言标准. SQL server版本

SQL Server代理(5/12):理解SQL代理错误日志

SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 如我们在这个系列的前几篇文章所见,SQL Server代理是由一系列的作业步骤组成,每个步骤是不同类型将要进行的工作.如果你在第4篇所见,SQL Server代理也提供使用数据库邮件发送提醒的能力.如果出现问题,不管怎样, 你必须去查看下数据库邮件错误日志.在这篇文章里,你会学到如何理解和查看SQL Server错误日志的所有相关知识.你会

SQL Server中存储过程 比 直接运行SQL语句慢的原因

问题是存储过程的Parameter sniffing 在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1. 存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 2. 经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete时),可将此复杂操作用

SQL SERVER性能分析--死锁检测数据库阻塞语句

工作中数据库经常出现内存,找了篇文章 参照CSDN,中国风(Roy)一篇死锁文章 阻塞:其中一个事务阻塞,其它事务等待对方释放它们的锁,同时会导致死锁问题. 整理人:中国风(Roy) 参照Roy_88的博客 http://blog.csdn.net/roy_88/archive/2008/07/21/2682044.aspx 日期:2008.07.20 ************************************************************************

SQL Server中存储过程比直接运行SQL语句慢的原因

原文:SQL Server中存储过程比直接运行SQL语句慢的原因 在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1.       存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 2.       经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query

SQL Server on Ubuntu——Ubuntu上的SQL Server(全截图)

本文从零开始一步一步介绍如何在Ubuntu上搭建SQL Server 2017,包括安装系统.安装SQL等相关步骤和方法(仅供测试学习之用,基础篇). 一.   创建Ubuntu系统(Create Ubuntu System) 1.      前提准备 由于本文主要研究SQL Server 2017在Linux上的搭建方法,从Install SQL Server on Linux中得知当前SQL Server 2017 CTP 2.0对于Ubuntu系统支持16.04和16.10,同时可以直接下

转:SQL SERVER 2014 安装图解(含 SQL SERVER 2014 安装程序共享)

开篇介绍 2015年1月1日,新的一年开始之际,本来应该好好做点有意义的事情来跨个年的.结果,老习惯 - 睡觉之前一定要折腾一下电脑,说干就干,给新到的 DELL 电脑装虚机,下载 SQL SERVER 2014,安装 SQL SERVER 2014. SQL SERVER 2014 安装完成以后,不像 SQL SERVER 2008 R2 会提供一个 BIDS 开发工具,也不像 SQL SERVER 2012 会提供一个 SSDT 开发工具,也就是说 BI 的开发工具(SSIS, SSRS,

SQL SERVER 2014 安装图解(含 SQL SERVER 2014 安装程序共享)- 2014已过去,不总结,不回望,2015朝前走

开篇介绍 2015年1月1日,新的一年开始之际,本来应该好好做点有意义的事情来跨个年的.结果,老习惯 - 睡觉之前一定要折腾一下电脑,说干就干,给新到的 DELL 电脑装虚机,下载 SQL SERVER 2014,安装 SQL SERVER 2014. SQL SERVER 2014 安装完成以后,不像 SQL SERVER 2008 R2 会提供一个 BIDS 开发工具,也不像 SQL SERVER 2012 会提供一个 SSDT 开发工具,也就是说 BI 的开发工具(SSIS, SSRS,