[转]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行的表扫描成本是单行表扫描的两倍。