Microsoft SQL Server 2005技术内幕:T-SQL查询笔记

logical operation:基于微软查询处理概念模型的逻辑操作。例如,联接运算符的physical operation属性表示联接算法(nested loops,merge ,hash)物理运算符

logical operation属性表示逻辑联接类型(Inner join,outer join,semi join 等等)逻辑运算符

如果没有与该运算符关联的逻辑操作,则这项度量的值与physical operation相同

actual number of rows:从该运算符实际返回的行数(只显示在实际的计划中)

estimated I/O  cost和estimated cpu cost:运算符在特定资源上的估计成本(I/O或CPU)这两个度量将帮助你确定运算符是否是I/O密集或CPU密集的

例如,你可以看到clustered index seek运算符主要与I/O有关,而hash match运算符主要与cpu有关

estimated operator cost:执行该操作的成本

estimated subtree cost:如前所述,他表示到当前节点为止整个子树的累积成本

estimated number of rows:该运算符预计的返回行数。在有些情况下,通过观察实际行数和估计行数之间的差异,你可以找出因统计信息不足或其他原因而导致的成本问题

estimated row size:你可能会奇怪为什么在实际的查询计划中没有显示该属性的实际值。因为你的表可能包含可变长度类型,表中行的大小各异

actual rebinds和actual rewinds:这两个度量仅与作为nested loops联接内侧的运算符有关,在其他运算符中,rebinds将显示为1,rewinds将显示为0

他们表示内部init方法被调用的次数。重新绑定次数和重绕次数之和等于联接外侧所处理的行数。重新绑定意味着联接的一个或多个参数发生更改后,必须重新计划

联接的内侧。重绕意味着任何相关参数都没有发生更改,可以重用之前的内侧结果集

信息提示框的底部显示该运算符的其他信息,如关联的对象名称、输出、参数等

http://www.cnblogs.com/lyhabc/articles/3912608.html

 

 

预估执行计划 VS 实际执行计划
有两种类型的执行计划:预估和实际。预估的执行计划是在执行之前由查询优化器计算;它表明优化器信任为最低消耗的执行计划。通常大约在几秒之内返回给用户。实际执行计划,另一方面,处理查询过程中实际执行的步骤。在查询完成后实际的计划被返回。有时,预估和实际的值会不同。在执行计划中值为定量数据。查看图1对于一些执行计划值的一个示例。
为什么预估和实际执行计划值不同?
有三个原因来解释为什么执行计划值不同。
1.预估执行计划不能被创建
在查询优化器对查询创建预估的执行计划之前,Algebrizer组件会验证查询。如果一个对象在查询中不存在,验证失败并且没有创建预估的执行计划。这种情况,当一个创建语句位于使用这个创建对象的相同批中。
2.陈旧的统计信息
SQL Server对每个索引创建关于每个列值的分布的统计信息。当查询优化器预估从一个操作返回的行数的时候,使用该信息,并且完全使用一个特定索引的消耗来预估。当在表中数据改变时,这些统计信息过期。如果查询优化器使用坏的统计信息,它会错误的计算执行计划的消耗。通过比较预估行数和实际行数,你可以看到在实际执行计划中一个操作的差异(见图1)。图1中高亮显示的差异是对表执行一个删除操作产生的。
3.并行性
如果安装SQL Server的机器有多个CPU,查询优化器会完成两次寻找最低消耗执行计划的过程;创建一个执行计划使用一个处理器,第二个执行计划利用多个处理器(并行性)。直到执行时才会决定运行这两个执行计划中的哪个。当用户请求查看预估执行计划,只有一个执行计划被显示。这个执行计划可能是、也可能不是当执行查询时查询引擎所选择的那个。 (见下图) 图1 比较EstimatedNumber of Rows和Actual Number of Rows
哪个执行计划更好?
一个预估执行计划几乎立即被返回,而实际执行计划不能。实际的执行计划给出了一个更加完整的图片,但是在生产环境中,为了获得实际执行计划而等待一个长时间运行的语句执行完成是不切实际的。
只有在实际执行计划中找到的最频繁使用信息,是从每个操作返回的实际行数。实际行数可以与预估行数比较。如果差异巨大,那么统计信息很可能过时了。在这种情况下更新统计信息可能会提高查询性能(查看TechNet文章“统计信息”获得更多关于这个话题的信息)。
另一种获得实际行数的方式是,检查表的索引统计信息的最后时间已更新。将该信息与数据库的活动联系起来,将会表名统计信息的陈旧情况。以下查询运行在sys.indexes表返回已更新的统计信息的最后日期:

复制内容到剪贴板
代码:
USE YourDatabase GO SELECT name AS index_name , STATS_DATE(OBJECT_ID, index_id) AS StatsUpdated FROM sys.indexes WHERE OBJECT_ID = OBJECT_ID('YourSchema.YourTable')

只在实际执行计划中找到的其他信息
Actual Rewinds和Rebinds的值只会应用到少数几个操作。这些值计数特定操作初始化的次数。大量的初始化可能导致高I/O使用。对于该话题更完整的涵盖,看看Grant Fritchey的书SQL Server执行计划
除了Actual Rewinds和Rebinds,Number of Executions在SQL Server 2008中引入。该值是一个操作被执行次数的计数。对一些操作,执行次数和返回行数相关,预估和实际的执行次数会根据预估和实际行数的不同而不同。在某些情况下,SQL Server不能预估执行计数,将会在Estimated Number of Executions显示值为1。
预估的执行计划包含预估的消耗,逻辑上导致实际执行计划包含实际消耗。然而,情况并非如此。正如之前提到的,计数值只是表明一个操作时间消耗上的相对昂贵程度。它不与任何实际值如CPU和I/O时间相关。

tt.jpg 

2016-1-28 10:43

tt.jpg

补充(1):


分析——》绑定——》优化


分析:检查,例如检查使用分隔标识符的表或列名称是否以数字开头,分析几乎是所有编程语言编译器的一项常规操作。


绑定:确定SQL语句所引用对象的特征检查请求语义是否有意义,例如检查From A join B的查询时,如果A是一个表B是一个存储过程,则绑定失败。


优化:类似于绑定,优化器一次只优化批处理中的一条语句,在编译器为该批处理生成执行计划并存储到plan cache之后将执行该计划的执行上下文(execute context)的特殊副本。sqlserver像缓存执行计划一样缓存执行上下文。sqlserver并不优化batch中的每条sql语句,他只优化那些访问表而且可能生成多个执行计划的语句,sqlserver优化所有的DML。只有被优化过的语句才会生成执行计划

 

补充(2):

执行计划指标值

logical operation:基于微软查询处理概念模型的逻辑操作。例如,联接运算符的physical operation属性表示联接算法(nested loops,merge ,hash)物理运算符

logical operation属性表示逻辑联接类型(Inner join,outer join,semi join 等等)逻辑运算符

如果没有与该运算符关联的逻辑操作,则这项度量的值与physical operation相同


actual number of rows:从该运算符实际返回的行数(只显示在实际的计划中)

estimated I/O cost和estimated cpu cost:运算符在特定资源上的估计成本(I/O或CPU)这两个度量将帮助你确定运算符是否是I/O密集或CPU密集的

例如,你可以看到clustered index seek运算符主要与I/O有关,而hash match运算符主要与cpu有关

estimated operator cost:执行该操作的成本

estimated subtree cost:如前所述,他表示到当前节点为止整个子树的累积成本

estimated number of rows:该运算符预计的返回行数。在有些情况下,通过观察实际行数和估计行数之间的差异,你可以找出因统计信息不足或其他原因而导致的成本问题

estimated row size:你可能会奇怪为什么在实际的查询计划中没有显示该属性的实际值。因为你的表可能包含可变长度类型,表中行的大小各异

actual rebinds和actual rewinds:这两个度量仅与作为nested loops联接内侧的运算符有关,在其他运算符中,rebinds将显示为1,rewinds将显示为0

他们表示内部init方法被调用的次数。重新绑定次数和重绕次数之和等于联接外侧所处理的行数。重新绑定意味着联接的一个或多个参数发生更改后,必须重新计划

联接的内侧。重绕意味着任何相关参数都没有发生更改,可以重用之前的内侧结果集

 

转载于:https://www.cnblogs.com/firstdream/p/7274416.html

本书是Inside Microsoft SQL Server 2005系列四本著作中的一本。它详细介绍了T-SQL的内部体系结构,包含了非常全面的编程参考,提供了使用Transact-SQL(T-SQL)的专家级指导,囊括了非常全面的编程参考,揭示了基于集合的查询的强大威力,并包含大量来自专家们的参考和建议。本书适合专业数据库开发者、BI开发者、DBA和以SQL Server作为后台数据库的一般应用程序开发者,读者可以通过书中的最佳实践、高级技巧和代码示例来掌握这门复杂的编程语言,以切合实际的方案来解决复杂的实际问题。   深入理解T-SQL体系结构,充分利用高级T-SQL查询技术。   本书深入介绍了T-SQL的内部体系结构,揭示了基于集合的查询的强大威力,并包含大量来自专家们的参考和建议。通过本书提供的最佳实践和示例代码,数据库开发人员和管理员完全可以掌握这门复杂的编程语言,以切合实际的方案来解决复杂的实际问题。通过本书,你将学习到如何:理解逻辑和物理的查询处理;使用方法论优化查询;在查询中用TOP选项修改数据;用递归逻辑、具体化路径或嵌套集合解决方案查询特殊的数据结构;通过逻辑难题提高你的逻辑能力并掌握查询问题的核心等。   你将学习到如何:   理解逻辑和物理的查询处理;   使用方法论优化查询;   解决关系分区问题;   使用CTE和排名函数简化及优化解决方案;   用各种技术聚合数据,包括附加属性、旋转、直方图和分组因子;   在查询中用TOP选项修改数据;   用递归逻辑、具体化路径或嵌套集合解决方案查询特殊的数据结构;   通过逻辑难题提高你的逻辑能力并掌握查询问题的核心; 内容简介 本书是Inside Microsoft SQL Server 2005系列四本著作中的一本。本书及其续篇——《Microsoft SQL Server 2005技术内幕:T-SQL程序设计》介绍了SQL Server 2005中高级T-SQL查询、查询优化及编程相关的知识。这两本书侧重于解决实践中的常见问题,并讨论了解决这些问题的方法。它们将向你揭示基于集合(set-based)查询的强大威力,并解释为什么它比使用游标的过程化编程(procedural programming)更具优势。同时,它还会教你识别使用基于游标解决方案与基于集合解决方案的优劣。   书中还讲述了其他几种争议较多的构造(camstruct)——如临时表、动态执行、XML和.NET集成——它们在具有强大功能的同时,也具有极大的风险。   本书适合于需要编写或检查T-SQL代码的有经验的T-SQL程序员和数据库专业人员。读者可从中学到大量精湛的技巧,这些技巧会充实您的工具箱和编码技能,并让您顺利地开发出高效的解决方案。 作者简介 Itzik Ben-Gan是Solid Quality Learning的首席导师和创始人。他从1999年开始便一直是SQL Server方面的Microsoft MVP,在世界各地讲授 T-SQL查询、编程和查询优化相关的课程,并提供相关咨询服务。他在SQL Server Magazine和MSDN上发表了多篇文章,并被邀请在许多专题会议上做过报告,包括TechEd、DevWeek、PASS和SQL Server Connections。 目录 序 前言 致谢 引言  本书的组织  系统要求  安装示例数据库  更新  代码示例  本书支持 第1章 逻辑查询处理  逻辑查询处理中的各个阶段   逻辑查询处理阶段简介  Customers/Orders场景下的示例查询  逻辑查询处理步骤详解   步骤1:执行笛卡尔乘积(交叉联接)   步聚2:应用ON筛选器(联接条件)   步骤3:添加外部行(Outer Row)   步骤4:应用WHERE筛选器   步骤5:分组   步骤6:应用CUBE或ROLLUP选项   步骤7:应用HAVING筛选器   步骤8:处理SELECT列表   步骤9:应用DISTINCT子句   步骤10:应用ORDER BY子句   步骤11:应用TOP选项  SQL Server 2005中新的逻辑处理阶段   表运算符   OVER子句   集合操作  结论 第2章 物理查询处理  查询处理期间的数据流  编译   Algebrizer   优化   使用查询计划   更新计划  结论   致谢 第3章 查询优化  本章用到的示例数据  优化方法论   分析实例级的等待   联系等待和队列   确定方案   细化到数据库/文件级别   细化到进程级别   优化索引/查询  查询优化工具   syscacheobjects   清空缓存   动态管理对象   STATISTICS IO   测量查询的运
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值