查询开销

原文:查询开销

  尽管查询的执行计划提供了详细的处理策略的单独步骤涉及的估计相对开销,但是它没有提供查询实际的CPU使用、磁盘读写或持续时间等开销。

  还有其他比运行Profiler更直接手机性能数据的方法

一、客户统计

  客户统计将计算机作为服务器的一个客户端,从这个角度出发去捕捉执行信息。这意味着任何记录事件包括通过网络传送数据的时间,而不仅仅是SQL Server本身所花费的时间。

  要使用客户统计,只需要单击=》查询=》包含客户统计。

  现在,每当运行一个查询,就会收集一个限定的数据集,包括执行事件,影响的行数、到服务器的往返次数等。进一步,查询的每次执行在客户统计选项卡上被分别显示,有一列将多次的执行进行累加并显示所收集数据的平均值。该统计也以箭头方式显示一次运行和下次运行之间事件或计数是否改变。

  

  执行查询语句,显示的客户端信息如下:

  

  虽然捕捉客户统计可能收集数据的有用手段,但这是个有限的数据集,没有办法显示一次执行与另一次的差别。甚至可能运行完全不同的一个查询,它的数据可能与其他的混合在一起,从而使平均值失去意义。如果需要这么做可以重置客户统计=》查询=》重置客户端统计实现。

二、执行时间

  Duration和CPU都代表着查询的时间因素。要获得关于解析、编译和执行查询的总时间详细信息,可以通过SET STATISTICS TIME实现:

  

  执行时间CPU 时间 = 125毫秒表示Profiler工具和服务器跟踪选项所提供的CPU值。相似地对应的占用时间 = 1065毫秒表示其他机制提供的Duration值。

  分析和编译时间意味着优化器重用这个查询现有的执行计划,因此不必花费任何时间来再次解析和编译时间。如果查询第一次执行,那么优化器必须首先解析查询语法,然后编译它以生成执行计划。这个可以调用DBCC FREEPROCCACHE清楚缓存,然后重新运行查询:

  

  不应该在生产系统上运行DBCC FREEPROCCACHE,除非准备胡斐无谓的开销重新编译系统上的每个查询,某种程度上,这个系统重启的开销相同。

三、统计IO

  为了减少读操作总数,发现查询中访问的所有表以及对应的读操作数量是有用的。

  要获得执行查询所化花费的IO可以通过操作GUI得到:

  查询=》查询选项=》设置STATISTICS IO:

  

  

  当然也可以通过编程的方式开启:

  

  在解读STATISTICS IO输出时,多半会参考逻辑读操作数量,有时候也会参考扫描计数。但即使每个扫描执行很少的逻辑读,STATISTICS IO所提供的逻辑读总数仍然可能会很高。如果每个扫描的逻辑读数量对于特定的表很小,那么可能无法进一步地改进该表的索引机制。物理读操作和预读数量在数据无法在内存中找到时不为0,但是一旦数据填写到内存,物理读和预读将趋近于0。

  知道查询使用的所有表及其对应的读操作数量还有另一个好处。SQL Server机器上运行的重要服务和后台应用通常会影响所观测的查询处理时间,Duration和CPU值在表结构或数据没有变化的情况下重新执行相同查询,结果常常有很大的波动。

  在优化各步骤期间,需要一个没有被动的开销数字作为参考。读操作数量在固定的表结构和数据下的查询多次执行之间不会有变化。例如,如果执行SELECT语句10次,可能得到10个不同的Duration和CPU数值,但Reads每次都保持一致。

  下面还给出一些常用的计数及清除缓存的方法:

操作 说明
DBCC DROPCLEANBUFFERS 清空数据缓存
DBCC FREEPROCCACHE 清空编译缓存 

  其他统计操作说明:

选项 说明 
SET NOCOUNT 当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。
SET ARITHABORT 在查询执行过程中发生溢出或被零除错误时终止查询。
SET NOEXEC 编译但不执行语句
SET SHOWPLAN_TEXT 不执行 Transact-SQL 语句。但由 SQL Server 返回有关如何执行语句的详细信息。
SET PARSEONLY 解析但不编译或执行语句
SET STATISTICS TIME 统计执行语句所消耗时间
SET STATISTICS IO 统计执行语句所消耗IO
SET CONCAT_NULL_YIELDS_NULL 控制是将串联结果视为 Null 还是空字符串值。ON:SELECT ‘abc‘ + NULL; 返回NULL;OFF:SELECT ‘abc‘ + NULL; 返回abc
SET TRANSACTION ISOLATION LEVEL 控制到 SQL Server 的连接发出的 Transact-SQL 语句的锁定行为和行版本控制行为。
SET DEADLOCK_PRIORITY 指定当前会话与其他会话发生死锁时继续处理的相对重要性。
SET LOCK TIMEOUT 指定语句等待锁释放的毫秒数。
SET QUERY_GOVERNOR_COST_LIMIT 数值或整数值,用于指定可以运行查询的最长时间。查询调控器不允许执行估计开销超过该值的任何查询。如果指定此选项为 0(默认),将关闭查询调控器,并且允许所有查询无限期运行。

更多的设置,可以查看MSDN:http://technet.microsoft.com/zh-cn/library/ms186736(v=sql.90).aspx

时间: 2024-10-14 07:35:44

查询开销的相关文章

链接服务器对查询的影响

年底优化,收集12小时的Profiler跟踪文件,用RML分析查看消耗前N的语句:上图是某生产环境特定LoginName,消耗前N的情况(按总CPU降序).蓝色底纹的是几个调用频繁的过程,可以看到过程平均CPU在1000毫秒以上,平均执行时间在1.5秒左右,注意它们的平均逻辑读很低!查看存储过程代码,发现有一个共同点,与 链接服务器.数据库.架构.表名 LEFT JOIN关联查询.查看当前服务器使用链接服务器的例子:存储过程脚本如下:语句很简单,在同一窗口执行过程语句的主体部分,一个有链接服务器

MySQL之查询性能优化一

只有当查询优化,索引优化,库表结构优化齐头并进时,才能实现mysql高性能. 在尝试编写快速的查询之前,需要清楚一点,真正重要是响应时间. 通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后再服务器上进行解析,生成执行计划,执行,并返回结果给客户端. 其中"执行"可以认为是整个生命周期最重要的阶段,这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序,分组等. 对于一个查询的全部生命周期,上面列的并不完整.这里我们只是想说:了解查询的生命周期,

《高性能MySQL》读书笔记--查询性能优化

对于高性能数据库操作,只靠设计最优的库表结构.建立最好的索引是不够的,还需要合理的设计查询.如果查询写得很糟糕,即使库表结构再合理.索引再合适,也无法实现高性能.查询优化.索引优化.库表结构优化需要齐头并进,一个不落. 6.1 为什么查询速度会慢 通常来说,查询的生命周期大致可以按照顺序来看:从客户端>>服务器>>在服务器上进行解析>>生成执行计划>>执行>>返回结果给客户端.其中执行可以认为是整个生命周期中最重要的阶段,这其中包括了大量为了检索

走向面试之经典的数据库基础:二、SQL进阶之case、子查询、分页、join与视图

一.CASE的两种用法 1.1 等值判断->相当于switch case (1)具体用法模板: CASE expression WHEN value1 THEN returnvalue1 WHEN value2 THEN returnvalue2 WHEN value3 THEN returnvalue3  ELSE defaultreturnvalue END (2)具体使用示例: 假设我们有一个论坛网站,其中有一张User表{ UId,Name,Level },Level是一个int类型,代

mysql笔记03 查询性能优化

查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行的更快. 2). 通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器端,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中"执行"可以认为是整个生命周期中最重要的阶段,这其中包括 大量为了检索数据到存储引擎的调用以及调用后

SqlServer查询计划

阅读目录 开始 SQL Server 查找记录的方法 SQL Server Join 方式 更具体执行过程 索引统计信息:查询计划的选择依据 优化视图查询 推荐阅读-MSDN文章 对于SQL Server的优化来说,优化查询可能是很常见的事情.由于数据库的优化,本身也是一个涉及面比较的广的话题, 因此本文只谈优化查询时如何看懂SQL Server查询计划.毕竟我对SQL Server的认识有限,如有错误,也恳请您在发现后及时批评指正. 首先,打开[SQL Server Management St

SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)

前言 上一节我们简单讲述了表表达式的4种类型,这一系列我们来讲讲使用视图的限制,简短的内容,深入的理解,Always to review the basics. 避免在视图中使用ORDER BY 上一节我们也讲述了使用表表达式必须满足的3个要求,其中就有一个无法保证顺序,也就是说的ORDER BY的问题,我们还是重点看看在视图中的限制.在常规查询中对于排序我们是这样做的. USE AdventureWorks2012 GO SELECT * FROM Sales.SalesOrderDetail

SQL Server-聚焦过滤索引提高查询性能(十)

前言 这一节我们还是继续讲讲索引知识,前面我们聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解. 过滤索引,在查询条件上创建非聚集索引(1) 过滤索引是SQL 2008的新特性,被应用在表中的部分行,所以利用过滤索引能够提高查询,相对于全表扫描它能减少索引维护和索引存储的代价.当我们在索引上应用WHERE条件时就是过滤索引.也就是满足如下格式: CREATE NONCLUSTERED INDEX <index name> O

看懂SqlServer查询计划(转发)

看懂SqlServer查询计划 阅读目录 开始 SQL Server 查找记录的方法 SQL Server Join 方式 更具体执行过程 索引统计信息:查询计划的选择依据 优化视图查询 推荐阅读-MSDN文章 对于SQL Server的优化来说,优化查询可能是很常见的事情.由于数据库的优化,本身也是一个涉及面比较的广的话题,因此本文只谈优化查询时如何看懂SQL Server查询计划.毕竟我对SQL Server的认识有限,如有错误,也恳请您在发现后及时批评指正. 首先,打开[SQL Serve