原文:通过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万+

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

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

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 如我们在这个系列的前几篇文章所见,SQL ...

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

    原文:SQL Server中存储过程比直接运行SQL语句慢的原因 在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1.       存储过程只在创造时进行编译即可,以 ...

  3. Configure Always On Availability Group for SQL Server on Ubuntu——Ubuntu上配置SQL Server Always On Availability Group

    下面简单介绍一下如何在Ubuntu上一步一步创建一个SQL Server AG(Always On Availability Group),以及配置过程中遇到的坑的填充方法. 目前在Linux上可以搭 ...

  4. SQL Server中一些有用的日期sql语句

    SQL Server中一些有用的日期sql语句 1.一个月第一天的 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一 SELECT DA ...

  5. SQL Server温故系列(5):SQL 查询之分组查询 GROUP BY

    1.GROUP BY 与聚合函数 2.GROUP BY 与 HAVING 3.GROUP BY 扩展分组 3.1.GROUP BY ROLLUP 3.2.GROUP BY CUBE 3.3.GROUP ...

  6. SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享

    SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享 第一步建库和建表 USE [master] GO CREATE DATABASE [MonitorElapsedHighSQL] G ...

  7. [转]SQL SERVER – Importance of Database Schemas in SQL Server

    原文地址http://blog.sqlauthority.com/2009/09/07/sql-server-importance-of-database-schemas-in-sql-server/ ...

  8. 安装 SQL Server 2008 时提示需要删除 SQL Server 2005 Express 工具

    已安装 SQL Server 2005,安装 SQL Server 2008 时提示需要删除 SQL Server 2005 Express 工具 错误提示:已安装 SQL Server 2005 E ...

  9. SQL SERVER 2008配置Database Mail –用SQL 数据库发邮件

    SQL SERVER 2008配置Database Mail –用SQL  数据库发邮件 https://blogs.msdn.microsoft.com/apgcdsd/2011/06/28/sql ...

随机推荐

  1. DELPHI解析JSON格式化的日期

    DELPHI解析JSON格式化的日期 json返回的日期是 /Date(1560355200000)/ 这样的格式. 这个1560355200000,是指1970年以后的秒数. DELPHI如何解析这 ...

  2. What is the difference between XSS and CSRF from their execution perspective?

    What is the difference between XSS and CSRF from their execution perspective? https://www.quora.com/ ...

  3. 一个读取C#特性Description方法(zhuan)

    class Program { static void Main(string[] args) { string str= DB.write.ToDescription(); Console.Writ ...

  4. PHP 根据 IP 获取定位数据

    使用的工具 GEOIP 配置 在PHP中使用 使用的工具 GEOIP: 什么是GepIP ? 所谓GeoIP,就是通过来访者的IP, 定位他的经纬度,国家/地区,省市,甚至街道等位置信息.这里面的技术 ...

  5. ES6深入浅出-1 新版变量声明:let 和 const-3.视频 相关面试题

    执行顺序问题 请问console.log输出的值是多少 输出的肯定是1 假如这里有一行未知的代码 会打印出几? 如果这段未知的代码是a=2.那么其实console输出的就是2 只关心代码,没有关心代码 ...

  6. rf笔记

    1.使用robot 用例绝对路径 可执行用例 2.robot --h 可以查看命令用法 3. 创建字典 *** Settings *** Library         Collections *** ...

  7. VL10B 采购订单转DN

    传入采购订单项目建交货单 FUNCTION zmmfmXXXX. *"------------------------------------------------------------ ...

  8. 【用户体验度量】用户费力度评分(CES)

    http://www.woshipm.com/operate/2819882.html CES这个评分方式有点意思. 相关文章: http://www.woshipm.com/pd/856291.ht ...

  9. php关于文件上传的两个配置项说明

    ; Maximum allowed size for uploaded files.; http://php.net/upload-max-filesizeupload_max_filesize = ...

  10. scdbg分析shellcode

    https://isc.sans.edu/forums/diary/Another+quickie+Using+scdbg+to+analyze+shellcode/24058/ scdbg -f s ...