CBO的访问路径(Access Path)
访问路径是从数据库中查询数据的方式.主要包括
Ø 全表扫描
Ø ROWID扫描
Ø 索引扫描
Ø 聚簇扫描
Ø HASH扫描
Ø 样例表扫描
全表扫描
全表扫描时,读取该表所有的记录,然后过滤掉不满足要求的数据.仅扫描和读取高水平线一下的块.
全表扫描时,所有块被顺序读取.因为块一半都是毗邻的,为了加速处理,通常I/O调用比单块要大些.每次块读取的数量是由DB_FILE_MULTIBLOCK_READ_COUNT参数决定的
为什么选择全表扫描
全表扫描的成本要比索引方式访问离散的块要小,这是因为全表扫描使用较大的I/O调用,而少数的大I/O调用要比多次调用成本更低
什么时候选择全表扫描
Ø 缺乏索引 如采用了函数,却没有创建函数索引
Ø 大批量数据 优化器认为查询需要访问表中的多数快
Ø 小表 表的(HWM下)总块数小于DB_FILE_MULTBLOCK_READ_COUNT块
Ø 高度并行
Ø 强制(HINT)全表扫描 /*+ FULL(Table_Name) */
ROWID扫描
行中的ROWID确定了包含该记录的数据文件和数据块,通过ROWID方式定位一条记录是访问单记录最快的方式,因为它直接给出了数据库中该记录最准确的位置.
索引扫描
包括以下几种类型:
Ø 唯一索引扫描(Index Unique Scans)
通常是Unique Index 或者主键,最多返回单行记录
Hint强制 INDEX(alias index_name)
Ø 范围索引扫描(Index Range Scans)
范围索引扫描是访问数据最常用的方法,可以有或者没有边界值.数据将以索引字段的升序返回,相通值以Rowid升序返回.
Col1 = :b1
Col1 < :b1
Col1 > :b1
Col1 like ‘XX%’
Hint强制 INDEX(alias index_name)
Ø 范围索引降序扫描(Index Range Scans Descending)
范围索引降序扫描和范围索引扫描是一样的,除了数据以降序形式返回.
Hint强制 INDEX_DESC(alias index_name)
Ø 跳转索引扫描(Index Skip Scans)
跳转索引扫描能够改进非前导字段的索引扫描,访问索引块通常要好于访问数据快.例如组合索引中的前导列可能没有用于查询.通常适用于前导列选择性比较高,后续列选择性较低的查询
例如 Employee(sex,employee_id,address)或者Employee(sex,employee_id)
Ø 全扫描(Full Scans)
全扫描适用于:所有待查询列均包含在索引中,至少一个列非空.可以消除排序
Ø 快速全索引扫描(Fast Full Index Scans)
和全扫描相互替代,适用于待查询字段,快速全索引扫描扫描所有的,并且不能消除排序
同时需要指定OPTIMIZER_FEATURES_ENABLE参数
Hint强制 INDEX_FFS(alias index_name)
Ø 索引连接(Index Joins)
索引连接是几个包含查询时所有字段索引的Hash连接
Hint强制 INDEX_JOIN(alias index_name)
Ø 位图连接(Bitmap Joins)
位图连接使用位图,并把位图位置转换成Rowid,位图能够有效合并索引,满足AND和OR条件的Boolean操作.
连接(Joins)
优化器评估每种连接的成本,然后选择最低成本的方式.假如一个连接返回多行,优化器将会考虑以下三种情况.
嵌套循环连接 当一个连接返回大批记录时(例如,超过10000行),嵌套循环是没有效率的,优化器可能不会使用.嵌套循环的成本根据以下公式进行计算:
cost= access cost of A + (access cost of B * number of rows from A)
HASH连接 使用CBO时,当连接返回大批记录时,HASH连接是最有效的.HASH连接的成本通过以下公式计算:
cost= (access cost of A * number of hash partitions of B) + access cost of B
排序合并连接 使用CBO时,当一个连接返回大批数据时,Merge连接也是最有效的.Merge连接的成本通过以下公式计算:
cost= access cost of A + access cost of B +(sort cost of A + sort cost of B)
如果数据已经预排序,排序成本则为0
SORT_AREA_SIZE(适用于shared server)和PGA_AGGREGATE_TARGET(被推荐使用)
反连接(Anti-join)返回左侧断言的行集,一般而言就是返回那些没有匹配在右侧的行集.可以用MERGE_AJ,HASH_AJ,NL_AJ强制hint
半连接(Semi-join)返回那些没有重复行的Exist子查询结果
可以使用MERGE_SJ,HASH_SJ,NL_SJ强制hint
星型查询
数据仓库被设计成星型模式,包含一个大的事实表和几个小的维度表.星型查询是事实表和查找表(Lookup表)的连接,CBO能够识别星型查询,并且产生有效的执行计划.
USE_HASH,USE_NL,USE_MERGE
USE_HASH使用HASH_AREA_SIZE和HASH_JOIN_ENABLED参数(shared server)或者PGA_AGGREGATE_TARGET(推荐)
USER_MERGE使用HASH_AREA_SIZE和SORT_AREA_SIZE参数(shared server)或者PGA_AGGREGATE_TARGET(推荐)
嵌套循环连接适用于一个大表和一个小表(volume<20000)的连接,通常以有条件限制的表为驱动表.
Hash连接适用于一个大表和一个较小表(volume>20000)的连接.通常以较小表作为驱动表,一般条件为等式连接.
排序合并连接适用于两个相对独立的行源,条件为行源已排序或者无需排序.或者适用于非等式连接.
影响CBO的参数
Ø CURSOR_SHARING
影响绑定变量的执行计划
Ø DB_FILE_MULTIBLOCK_READ_COUNT
影响全表扫描和索引的判断
Ø HASH_AREA_SIZE
影响HASH连接的操作
Ø HASH_JOIN_ENABLED
启用和失效HASH连接操作
Ø OPTIMIZER_INDEX_CACHING
控制嵌套循环时索引探测成本
Ø OPTIMIZER_INDEX_COST_ADJ
调整索引访问的成本
Ø OPTIMIZER_MAX_PERMUTATIONS
Ø OPTIMIZER_MODE
控制优化器的缺省优化方式
Ø PARTITION_VIEW_ENABLED
分区视图探测
Ø QUERY_REWRITE_ENABLED
物化视图的查询重写功能
Ø SORT_AREA_SIZE
影响排序性能
Ø STAR_TRANSFORMATION_ENABLED
增强星型转换方式
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6517/viewspace-145522/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/6517/viewspace-145522/