通过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,要改过来。
-
-- *** Change the Session ID values as per your need ***
-
-
-
-
-- Check for existing session
-
-
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='Waits_of_Particular_Session')
-
-
DROP EVENT session Waits_of_Particular_Session ON SERVER;
-
-
GO
-
-
-
-
-- Create a session and add events and actions
-
-
CREATE EVENT SESSION Waits_of_Particular_Session
-
-
ON SERVER
-
-
ADD EVENT sqlserver.sql_statement_starting
-
-
(
-
-
ACTION (sqlserver.session_id,
-
-
sqlserver.sql_text,
-
-
sqlserver.plan_handle)
-
-
WHERE
-
-
sqlserver.session_id > 52 AND sqlserver.session_id < 54
-
-
),
-
-
ADD EVENT sqlos.wait_info
-
-
(
-
-
ACTION (sqlserver.session_id,
-
-
sqlserver.sql_text,
-
-
sqlserver.plan_handle)
-
-
WHERE
-
-
sqlserver.session_id > 52 AND sqlserver.session_id < 54
-
-
),
-
-
ADD EVENT sqlos.wait_info_external
-
-
(
-
-
ACTION (sqlserver.session_id,
-
-
sqlserver.sql_text,
-
-
sqlserver.plan_handle)
-
-
WHERE
-
-
sqlserver.session_id > 52 AND sqlserver.session_id < 54
-
-
),
-
-
ADD EVENT sqlserver.sql_statement_completed
-
-
(
-
-
ACTION (sqlserver.session_id,
-
-
sqlserver.sql_text,
-
-
sqlserver.plan_handle)
-
-
WHERE
-
-
sqlserver.session_id > 52 AND sqlserver.session_id < 54
-
-
)
-
-
ADD TARGET package0.asynchronous_file_target
-
-
(SET filename=N'C:\Temp\Waits_of_Particular_Session.xel')
-
-
WITH (MAX_DISPATCH_LATENCY = 5 SECONDS, EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS, TRACK_CAUSALITY=ON)
-
-
GO
-
-
-
-
-- Start the Session
-
-
ALTER EVENT SESSION Waits_of_Particular_Session ON SERVER
-
-
STATE = START
-
-
GO
-
-
-
-
-- Run the query from the SPID
-
-
-
-
-- Code to stop the session once the query execution completes
-
-
ALTER EVENT SESSION Waits_of_Particular_Session ON SERVER
-
-
STATE = STOP
-
-
GO
2、然后,运行你的语句:select * from dbo.ttt
3、最后,运行下面的语句,获取各类操作所消耗的时间:
-
-- Parse the XML to show wait details
-
-
SELECT
-
-
event_xml.value('(./@name)', 'varchar(1000)') as Event_Name,
-
-
event_xml.value('(./data[@name="wait_type"]/text)[1]', 'nvarchar(max)') as Wait_Type,
-
-
event_xml.value('(./data[@name="duration"]/value)[1]', 'int') as Duration,
-
-
event_xml.value('(./data[@name="opcode"]/text)[1]', 'varchar(100)') as Operation,
-
-
event_xml.value('(./action[@name="session_id"]/value)[1]', 'int') as SPID,
-
-
event_xml.value('(./action[@name="sql_text"]/value)[1]', 'nvarchar(max)') as TSQLQuery,
-
-
event_xml.value('(./action[@name="plan_handle"]/value)[1]', 'nvarchar(max)') as PlanHandle
-
-
FROM
-
-
(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
-
-
CROSS APPLY xml_event_data.nodes('//event') n (event_xml)
-
-
WHERE
-
-
event_xml.value('(./@name)', 'varchar(1000)') IN ('wait_info','wait_info_external')
-
-
-
-
-- Code to drop the session
-
-
DROP EVENT SESSION Waits_of_Particular_Session ON SERVER;
这段监控的语句,在网友的服务器上执行,最后发现,时间主要消耗在了NETWORK_IO上,也就是网络。
通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?的更多相关文章
- SQL Server代理(5/12):理解SQL代理错误日志
SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 如我们在这个系列的前几篇文章所见,SQL ...
- SQL Server中存储过程比直接运行SQL语句慢的原因
原文:SQL Server中存储过程比直接运行SQL语句慢的原因 在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1. 存储过程只在创造时进行编译即可,以 ...
- 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上可以搭 ...
- SQL Server中一些有用的日期sql语句
SQL Server中一些有用的日期sql语句 1.一个月第一天的 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一 SELECT DA ...
- 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 ...
- SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享
SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享 第一步建库和建表 USE [master] GO CREATE DATABASE [MonitorElapsedHighSQL] G ...
- [转]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/ ...
- 安装 SQL Server 2008 时提示需要删除 SQL Server 2005 Express 工具
已安装 SQL Server 2005,安装 SQL Server 2008 时提示需要删除 SQL Server 2005 Express 工具 错误提示:已安装 SQL Server 2005 E ...
- SQL SERVER 2008配置Database Mail –用SQL 数据库发邮件
SQL SERVER 2008配置Database Mail –用SQL 数据库发邮件 https://blogs.msdn.microsoft.com/apgcdsd/2011/06/28/sql ...
随机推荐
- 【源码】openresty 限流
小结: 1.在连接环节计数,有清零环节 有3个参量 maxburst unit_delay https://github.com/openresty/lua-resty-limit-traffic/b ...
- MySQL格式化时间date_format
select date_format(deal_date, '%Y年%m月%d日 %H时%i分%s秒'), date_format(deal_date, '%Y-%m-%d %H:%i:%s') fr ...
- SurfaceView概述和基本使用
Android屏幕刷新一遍时间间隔为16ms,如果view能够在16ms内完成所需要执行的绘图换作,那么在视觉上,界面就是流畅的,否则就会出现卡顿现象,在很多情况下,这些逻辑处理又是必须的,为了解决这 ...
- Inventor2018专业版软件安装激活教程
如果你安装的是Autodesk Inventor Professional 2018,那么序列号为:666-69696969,产品密钥为:797J1, 如果你安装的是Autodesk Inventor ...
- 阶段5 3.微服务项目【学成在线】_day18 用户授权_11-前端集成认证授权-身份校验
把下面赋值到nginx中 前端的服务需要配置一下 重启nginx 启动教学管理的前端 没有登陆直接就进来教学管理的后端了 下面我们要做的就是这两件事 1.前端页面校验用户的身份,如果用户没有登录则跳转 ...
- 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_20-认证接口开发-接口测试
测试接口 因为继承了spring security会拦截这个请求,我们需要写代码 让他对这个认证接口放行 查看代码发现之前已经写过放行的代码了 发现是路径前面少了auth 加断点,测试.申请令牌 r ...
- 【Leetcode_easy】674. Longest Continuous Increasing Subsequence
problem 674. Longest Continuous Increasing Subsequence solution class Solution { public: int findLen ...
- 开始学习Docker啦--容器理论知识(一)
目录 一.容器核心技术 1.容器规范 2.容器 runtime 3.容器管理工具 4.容器定义工具 5.Registry 6.容器 OS 二.说说容器 1.什么是容器 Containers vs. v ...
- 修改centos7命令行控制台屏幕分辨率
1) vi /etc/sysconfig/grub 2) GRUB_CMDLINE_LINUX 在rhgb前加 vga=0x0317 (317为分辨率编码) 3) grub2-mkconfig - ...
- 域名购买、SSL证书申请使用和本地服务映射外网
万网购买域名 1.在如下网址购买,价格不是很贵,几块钱一年的都有:https://wanwang.aliyun.com/domain/?spm=5176.100251.111252.24.4ddd4f ...
