Oracle Optimizer:迁移到使用基于成本的优化器-----系列1.3
** 3.2.3 ** 可用 CBO 模式 ** **
CBO 有两种运行模式 :ALL_ROWS 和 FIRST_ROWS.
FIRST_ROWS 的目标是尽可能最快的返回行 . 这种模式告诉优化器响应时间是最重要的。它偏好嵌套连接方式 . FIRST_ROWS 也以考虑成本为主要规则来处理行 . 通常规则是使用索引的计划而不是使用全表扫描的计划作为访问路径 ,ORDER BY 子句导致索引访问 , 等等
从 9i 版本起,在 First 提示中行的数量可以在参数中设置 ,FRIST_ROWS_N(N 可以是 1,10,100 或者 1000), 随不同应用程序的需求而设置
ALL_ROWS 在返回输出结果以前 , 对给定的查询处理所有的行。它迫使优化器考虑最少的资源占用和最佳的吞吐量 . ALL_ROWS 更喜欢排序合并操作
对于一个 OLTP 系统 , FIRST_ROWS 对于快速响应时间是一个理想的选项 .
对于批处理方向的应用程序意味着使用 ALL_ROWS. 注意 , 以最快响应时间的返回第 N 行的计划可能不是一个理想的计划,如果系统需求获得完整的结果 . 因此应根据应用程序的需要而决定 .
当数据库大小变化时 CBO 动态调整它的执行路径,因此如果对于同一个应用程序同样的查询 , 一个数据库设置中运行很好而在另外的数据库中运行不良,你不必要理会 . 如果在两个数据库中设置和统计资料不同,这个将会发生 .. 为了防止出现这种情况 . 得考虑使用优化器持久性 . 稍后章节将会提到 .
3.2.3 CBO 基初术语
当 CBO 分析语句时,下列术语将会频繁使用
Cost (成本)
在 CBO 中,成本的计算是涉及到每一个操作单位。逻辑上花费多少成本实际上并没有文档化或向外界公布,甚至随版本的不同而发生变化 .
Cardinality (基数)
索引中单一行的数量和表中行的数量 . 查询基数是希望返回行的数量 .
Selectivity( 选择性 )
单一值的数量 , 被索引列的单一值视为选择性 . 举例来说,如果一个表有 10000 行,已创建的一个索引在一个列中有 4000 单一值 , 那么索引的可选择性为 4000/10000*100=40%, 在不为空的列上唯一索引的可选择性为 100%.
Transitivity( 传递性 )
对于查询 ,CBO 生成额外谓词的处理 . 它使优化器能考虑额外的执行路径。举例来说,如果在查询中提供了 A=B AND B=C 的谓词,优化器可能会添加额外的谓词来暗示 A=C.
Statistics( 统计资料 )
对于各种不同的数据收集许多必须的信息以支持对象 .. 对于 CBO 执行计划来说,它是至关重要的。
Join Methods( 连接方法 )
Oracle 用诸如哈希,合并排序和嵌套连接进行连接 . 一个查询可能运行的更快相比较其它的其它方法。对于单个的查询应该评估连接方法。
FTS (全表扫描)
全表扫描涉及到查询,从第一块到最后分配的块扫描。对于大表是极其昂贵的,应该避免。
Index scan( 索引扫描 )
涉及到通过使用表上一个或更多的索引 , 一个表上的随机访问 .