ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle学习系列—数据库优化—Access Path和join学习

Oracle学习系列—数据库优化—Access Path和join学习

原创 Linux操作系统 作者:bq_wang 时间:2007-04-17 00:00:00 0 删除 编辑
呵呵,边学习边翻译,权当笔记了...

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,位图能够有效合并索引,满足ANDOR条件的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_SIZEHASH_JOIN_ENABLED参数(shared server)或者PGA_AGGREGATE_TARGET(推荐)

USER_MERGE使用HASH_AREA_SIZESORT_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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-07

  • 博文量
    412
  • 访问量
    1106621