[转]SQL Server 2000执行计划成本(1/5)
表扫描
当没有合适的索引时就发生表扫描操作。这可能意味着没有索引存在或者预期有很多行且比扫描整个表开销更少。如果表是一个堆表,执行计划显示表扫描操作;如果表有聚集索引或者所有需要的值都在一个非聚集索引里如图2-6显示,那么执行计划显示一个索引扫描操作。
图2-6.表扫描的执行计划和聚集索引扫描操作
图2-7和2-8显示表扫描和索引扫描操作的成本细节。索引扫描和表扫描有相同的成本结构。
图2-7.表扫描的成本细节
图2-8.聚集索引扫描的成本细节
通过检查表的一个范围的页和行的I/O和CPU成本,执行计划成本规则如下:
CPU Cost = 0.0000785 + 0.0000011 per row
I/O的基本成本(0.0375785)正好是6×0.0062500+0.0000785。通过任何平台(1P/2P/4P)观察到的表扫描成本组成没有任何变化。
索引搜索和表扫描的交叉点
每个表只能有一个聚集索引。为每个查询建立覆盖索引而不使用聚集索引总是不切实际的。那么执行计划里可能执行下面两个选项中的一个:1)一个带有书签查找的索引搜索,或者2)表扫描(或聚集索引扫描)。当从搜索参数里预期只有少量的行时,执行计划采用带书签查找的索引搜索。当预期有很多行时,执行计划采用表扫描。正确的理解执行计划在哪儿从一个变为另一个是有用的。
表扫描的成本通过表使用的页数和表总共的行数来决定。表扫描的成本不依赖于返回的行数(除非使用聚合函数)。索引搜索操作的成本仅依赖于返回的行数和选择行数所在的索引的叶页数,但不依赖于影响索引深度的表的绝对大小。书签查找操作的成本是由表的大小影响的(以不确定的倍数关系影响),但适当地与行数线性相关。
表扫描开销小于带有书签查找的索引搜索的交叉点是通过使两个执行计划成本规则相等来决定的。通过把在书签查找I/O成本的不确定的倍数作为修正因子(CF)且撇开小成本的组成部分,交叉点就能大概被确定了。
两个执行计划在固定的启动成本上的区别是1P/2P系统有大约5个书签查找而4P系统有11个。对于1P/2P系统每增加一个书签查找行的成本是0.0062511的一倍而4P系统是0.0031260的一倍,包括I/O成本和CPU成本。表扫描里每增加一页的成本是0.000740741+0.0000011×(每页的行数)。这样,交叉点遵循的规则大约和下面的相关:索引搜索条件涉及到的行数和表的页数,术语称为页行比(pages-to-rows ratio)和修正因子(CF)。页行比在表扫描增加的成本与一个书签查找的成本相等时简单的指页数。修正因子(CF)是书签查找成本的百分比。
~ 11 + 页数 ÷ (CF×(页行比)) (4P系统)
既然表扫描里增加页的成本依赖于每页的行数,那么页行比就反映了每页的行密度。如图2-9所显示。
图2-9.页行比对每页的行密度
例如,考虑平均密度为每页100行的一个表。对于1P/2P系统的页行比是7.35且CF是~0.90。对于一个有506页的表来说,预计的交叉成本大约在81.5行发生,实际是84行。换句话说,当要求书签查找的时候,查询优化器为了使用索引而非表扫描需要索引的可选择性好于表里每0.9×7.35页就有1行。也许在成本交叉点和计划事务点处有细微的不同。
图2-10显示了索引搜索和被看作行功能的书签查找的执行计划成本和表扫描50000行每页99行的成本。表扫描的成本不依赖于返回的行。
图2-10.有50000行且每页99行的表的计划成本
图2-11共同显示了对于1P/2P和4P系统的索引搜索和作为行功能的书签查找计划的成本与表里计算页(假定每页100行)功能的表扫描的计划成本。为了比较也显示了作为行功能的覆盖索引搜索成本。如果知道页里表的大小,那么书签查找和表扫描的交叉点可以通过找到书签查找计划和表扫描有相同成本时的行数来决定,反之亦然。
图2-11.行/页计划成本
由于在1P/2P系统和4P系统里索引搜索和书签查找成本的不同,在4P系统上要达到表扫描交叉点的书签查找量是1P/2P系统的大约2倍。假定有很多多处理器系统使用共享总线,那么4P系统比1P/2P系统延迟切换到高总线带宽操作如表扫描上似乎是合理的。这一点没有明晰的解释。
在有大量的行参与时,书签查找计划成本对于1P/2P系统来说是覆盖索引搜索的700多倍而4P系统是350多倍。在这个例子里,覆盖索引每页正好超过400行。
注意覆盖索引和表扫描在很少的行参与时计划成本非常平坦。这是因为增加行的成本相对于固定的索引搜索和表扫描的基本成本而言是很低的。事实上,基于1P/2P系统的成本规则而言增加800行的成本是覆盖索引搜索每页100行成本的两倍,4P系统是400行。在45页里4500行的表扫描成本是单行表扫描的两倍。
转载于:https://www.cnblogs.com/killkill/archive/2008/12/23/1360445.html
[转]SQL Server 2000执行计划成本(1/5)相关推荐
- sql查询初学者指南_面向初学者SQL Server查询执行计划–类型和选项
sql查询初学者指南 When a DBA is working with the SQL Server, he/she might sometimes say that the execution ...
- SQL Server查询执行计划–基础
为什么查询执行对SQL Server性能很重要? (Why is query execution important for SQL Server performance?) SQL Server性能 ...
- 了解Sql Server的执行计划
前一篇总结了Sql Server Profiler,它主要用来监控数据库,并跟踪生成的sql语句.但是只拿到生成的sql语句没有什么用,我们可以利用这些sql语句,然后结合执行计划来分析sql语句的性 ...
- sql查询初学者指南_面向初学者SQL Server查询执行计划–聚集索引运算符
sql查询初学者指南 We have discussed how to created estimated execution plans and actual execution plans in ...
- sql查询初学者指南_面向初学者SQL Server查询执行计划–非聚集索引运算符
sql查询初学者指南 Now that we understand what Clustered Index Scan and Clustered Index Seek are, how they o ...
- 面向初学者的 SQL Server 查询执行计划(1)——聚集索引运算符(Clustered Index)
在本文中,我们将讨论与聚集索引相关的各种执行计划运算符,以及它们的作用.它们何时出现以及它们何时出现. 执行计划中的每一个运算符都会提供一些有关 SQL Server 运行方式的指标. 我们需要理解这 ...
- SQL Server实际执行计划COST欺骗案例
有个系统,昨天Support人员发布了相关升级脚本后,今天发现系统中有个功能不能正常使用了,直接报超时了(Timeout expired)的错误.定位到相关相关存储过程后,然后在优化分析的过程中,又遇 ...
- SQL SERVER 2012 执行计划走嵌套循环导致性能问题的案例
开发人员遇到一个及其诡异的的SQL性能问题,这段完整SQL语句如下所示: declare @UserId INT declare @PSANo VARCHAR(200) declare @ShipMo ...
- sql子句的执行顺序_SQL Server查询执行计划– WHERE子句的示例
sql子句的执行顺序 previous part of this article, we explained how indexes affect SQL Server query execution ...
最新文章
- php fileputcontents,在php中file_put_contents函数起什么作用呢?
- poj3934Queue(dp)
- java-forkjoin框架的使用
- cad绘制椭圆的方法有几种_CAD新手入门教学:如何绘制矩形?
- 成功解决 pypmml.base.PmmlError: (‘PmmlException‘, ‘Not a valid PMML‘)
- 【深入理解JVM】JVM概述
- 安全态势感知产品对比_设计中的对比和人的感知
- webapi+Quartz.NET解决若干定时程序同时运行的问题
- jquery的全选和多选操作
- [leetcode]从中序与后序/前序遍历序列构造二叉树
- jQuery 1.7.1 代码研究 extend
- TLS线程局部存储--thread_specific_ptr
- 收藏 | 12个神经网络可视化工具!
- 【Flink】Flink Table 基于Processing Time、Event Time的多种Window实现
- 为什么我们要使用min-height和max-height样式属性?
- 使用Dwr时出现java.lang.SecurityException: Access to debug pages is denied
- sso单点登录系统(精华篇)
- 【Android】 NDK开发中JNI配置及调用GPIO
- jQuery的ready方法实现原理分析
- 量化投资作业的R实现——收益率相关图形绘制
热门文章
- 闪烁点击效果css,CSS3自定义闪烁动画效果实例
- 每天一道LeetCode-----将数字集转成字母集,计算有多少种转换方式
- 二叉树的最大深度—leetcode104
- linux内核通用提权漏洞expliot 脏牛Dirty COW
- 最简单的进制转换函数
- Machine Learning Yearning book draft - 读记(前14章)
- 18.了解各种与排序有关的选择
- [转]C++中sleep()函数的使用
- java getclass方法_JAVA-初步认识-第十一章-object类-Getclass方法
- ActionBarDisplayOptions展示选项的菜单