oracle access path,Oracle学习系列—数据库优化—Access Path和join学习

本文详细介绍了数据库查询的多种访问路径,包括全表扫描、ROWID扫描、索引扫描等,并分析了何时选择全表扫描及其优势。讨论了不同类型的索引扫描,如唯一索引扫描、范围索引扫描,以及各种连接类型的成本计算和适用场景。此外,还提到了影响CBO(成本基优化器)决策的参数,如CURSOR_SHARING、HASH_AREA_SIZE等。
摘要由CSDN通过智能技术生成

呵呵,边学习边翻译,权当笔记了...

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

增强星型转换方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值