数据库
首页 > 数据库> > Oracle执行计划-访问数据的存取方法(3种)

Oracle执行计划-访问数据的存取方法(3种)

作者:互联网

1、Full Table Scans,FTS(全表扫描)
为实现全表扫描,oracle读取表中所有行,并检查每一行是否满足语句的where限制条件。利用多块读(一个多块读操作可以使一个I/O能读取多块数据块)的方法可以十分高效地实现全表扫描,通过设置db_block_multiblock_read_count可以设置一次I/O能读取的数据块个数,从而减少全表扫描是的I/O总块数,也就是通过预读机制将要访问的数据块预先读入内存中。只有在全表情况下才能使用多块读操作。
使用全表扫描的前提:在较大的表上不建议使用全表扫描,除非取出数据比较多,超过总量的5%-10%,或者你想使用并行查询功能。
在这里插入图片描述

2、Table Access By Rowid(通过rowid存取表,rowid lookup)
行的rowid指出了改行所在的数据文件,数据块及行在该块中的位置,所以通过rowid来存取数据可以快速定位到目标数据上,是oracle存取单行数据最快的方法。这种方法不会用到多块读操作,一次I/O只能读取一个数据块。
在这里插入图片描述

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

根据索引类型与where限制条件的不同,有4中类型的索引扫描:
(1)index unique scan(索引唯一扫描)
存在unique或者primary key的情况下,返回单个rowid数据内容。
在这里插入图片描述

(2)index range scan(索引范围扫描)
①在唯一索引上使用了range操作符(例如:>、<、<>、>=、<=、between);
②在组合索引上,只使用部分列进行查询;
③对非唯一索引上的列进行的查询。
在这里插入图片描述

(3)index full scan(索引全扫描)
需要查询的数据从索引中可以全部得到。

(4)index fast full scan(索引快速扫描)
与index full scan类似,但这种方法下不对结果进行排序。

标签:index,索引,访问,扫描,Oracle,全表,rowid,存取方法,数据
来源: https://blog.csdn.net/lin434406218/article/details/122745697