对于那些不能合并的视图,查询变换器能够将相关的谓词从查询块中推进到视图查询块
中。由于被推进的谓词能够用来访问索引或者用于过滤,这个技术通常可以改进那些不能被
合并的视图子计划。
非嵌套的子查询
和视图一样,子查询也是用一个独立的查询块来代表的。子查询是被嵌套在主查询或其
他子查询之中的,计划产生器在找到一个成本最低的执行计划之前被迫要试验所有可能的计
划。由嵌套子查询产生的限制可以在转换为非嵌套的子查询和连接之后消除,经由查询转换
器过滤之后绝大多数的子查询都会被转换为非嵌套的,然 后 这 些 非 嵌套的子查询产生独立的
子计划,这些子计划按照一种高效的方式进行排列,从而提高了整个查询计划的执行速度。
物化视图的查询重写
物化视图就是把一个查询的结果事先固化存储在一个表里,当 发现和物化视图一致的查
询语句就将相应的项用物化视图来重写。由于绝大多数的查询结果都事先计算好了,因 此 这
种 技术可以极大的提高查询速度。查询转换器负责查找和用户查询相关的所有物化视图,用
其中的一个或多个来重写查询。利用物化视图来重写查询也是基于成本的,如果不使用物化
视图的成本更低一些,则不会去使用物化视图。
评估器
评估器会产生下列三个度量值:
l 选择性(Selectivity)
l 基数(Cardinality)
l 成本(Cost)
这些值是相互关联的,一个值由其他值导出,评估器的最终目标是评估计划的总体成本。
如果有统计信息可用,评估器使用统计信息来计算这些值,统计信息可以提高其精确度。
选择性
这里的第一个度量值——选择性,表示所选择的行与行集的比值。所谓行集可以是表、
视图,或者是一个连接或 GROUP BY 操作的中间结果。选择性与查询中的谓词有关,比如
last_name=’Smith’,或者一个联合谓词 last_name=’Smith’ and job_type=’Clerk’。一个谓词充
当着一个过滤器的角色,在行集中过滤了一定量的行,谓词的选择性是一个比值,它表示一
个行集经过谓词的过滤后剩下的行占原有行集的比例。其值在 0.0 和 1.0 之间,0.0 表示在行
集中没有行被选择;1.0 表示行集中的所有行都被选择了。
如果没有可用的统计信息,评估器为选择性赋予一个内部的缺省值,这个内部缺省值随
着谓词的不同而不同。例如:等式谓词(last_name=’Smith’)的内部缺省值低于范围谓词
(last_name>’Smith’),评估器会假定等式谓词返回的行数小于范围谓词。
当存在可用的统计信息,评估器将使用统计信息来估算选择性。例如:对于一个等式谓
词(last_name=’Smith’ ),选择性的值是 distinct last_name 的 倒 数 即 :( 1/count(distinct
last_name))。但是如果在 last_name 字段上存在直方图(histogram),则选择性值为:count