predicate 列存储索引扫描_执行计划-数据访问方式(全表扫描与4种索引的方式)...

本文详细介绍了Oracle执行计划的概念,包括Rowid、Recursive sql、Row source和Predicate等。并讨论了Oracle访问数据的四种方法:全表扫描、通过Rowid存取、索引扫描(包括唯一扫描、范围扫描、全扫描和快速全扫描),通过实例解析了各种扫描的适用场景和性能影响。最后,对比了Index full scan和Index fast full scan的区别。
摘要由CSDN通过智能技术生成

执行计划

Oracle执行计划的相关概念:

Rowid:系统给oracle数据的每行附加的一个伪列,包含数据表名称,数据库id,存储数据库id以及一个流水号等信息,rowid在行的生命周期内唯一。

Recursive sql:为了执行用户语句,系统附加执行的额外操作语句,譬如对数据字典的维护等。

Row source(行源):oracle执行步骤过程中,由上一个操作返回的符合条件的行的集合。

Predicate(谓词):where后的限制条件。

Driving table(驱动表):又称为连接的外层表,主要用于嵌套与hash连接中。一般来说是将应用限制条件后,返回较少行源的表作为驱动表。在后面的描述中,将driving table称为连接操作的row source 1。

Probed table(被探查表):连接的内层表,在我们从driving table得到具体的一行数据后,在probed table中寻找符合条件的行,所以该表应该为较大的row source,并且对应连接条件的列上应该有索引。在后面的描述中,一般将该表称为连接操作的row source 2.

Concatenated index(组合索引):一个索引如果由多列构成,那么就称为组合索引,组合索引的第一列为引导列,只有谓词中包含引导列时,索引才可用。

可选择性:表中某列的不同数值数量/表的总行数如果接近于1,则列的可选择性为高。

————————————————————————————————————————

Oracle访问数据的存取方法:

1. Full table scans, FTS(全表扫描):

通过设置db_block_multiblock_read_count可以设置一次IO能读取的数据块个数,从而有效减少全表扫描时的IO总次数,也就是通过预读机制将将要访问的数据块预先读入内存中。只有在全表扫描情况下才能使用多块读操作。

2. Table access by rowed(通过rowid存取表,rowid lookup):

由于rowid中记录了行存储的位置,所以这是oracle存取单行数据的最快方法。

3. Index scan(索引扫描index lookup):

在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的rowid值,索引扫描分两步1,扫描索引得到rowid;2,通过 rowid读取具体数据。每步都是单独的一次IO,所以如果数据经限制条件过滤后的总量大于原表总行数的5%-10%,则使用索引扫描效率下降很多。而如果结果数据能够全部在索引中找到,则可以避免第二步操作,从而加快检索速度。

根据索引类型与where限制条件的不同,有4种类型的索引扫描:

3.1 Index unique scan(索引唯一扫描):

存在unique或者primary key的情况下,返回单个rowid数据内容。

3.2 Index range scan(索引范围扫描):

1,在唯一索引上使用了range操作符(>,,>=,<=,between);2,在组合索引上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值