◆全表扫描
这种类型的扫描从表中读取所有行,并过滤掉不符合选择条件的行。在全表扫描期间,将扫描表中位于高水位标记下的所有块。
高水位标志表示已使用的空间量,或已格式化以接收数据的空间量。检查每一行以确定它是否满足语句的WHERE子句。
当Oracle数据库执行全表扫描时,将按顺序读取这些块。由于这些块是相邻的,因此数据库可以进行比单个块更大的I/O调用来加快处理速度。
读调用的大小范围从一个块到初始化参数DB_FILE_MULTIBLOCK_READ_COUNT所指示的块的数量。使用多块读取,数据库可以非常有效地执行全表扫描。
数据库只读取每个块一次。
◆Rowid扫描
行的rowid指定数据文件和数据块,其中包含该行和该行在该块中的位置。通过指定一行的rowid来定位该行是检索单个行最快的方法,因为指定了该行在数据库中的确切位置。
要通过rowid访问表,Oracle数据库首先从语句的WHERE子句或通过对表的一个或多个索引的索引扫描获得所选行的行id。然后,Oracle数据库根据表中的rowid定位每个选定的行。
◆索引扫描
在这个方法中,通过遍历索引检索行,使用语句指定的索引列值。索引扫描根据索引中一个或多个列的值从索引中检索数据。要执行索引扫描,Oracle数据库将在索引中搜索语句访问的索引列值。如果语句只访问索引的列,那么Oracle数据库将直接从索引中读取索引的列值,而不是从表中读取。
索引不仅包含索引的值,还包含表中具有该值的行的行id。因此,如果语句访问索引列之外的其他列,那么Oracle数据库可以使用rowid访问表或使用集群扫描查找表中的行。
◆集群访问
数据库使用集群扫描从存储在索引集群中的表中检索具有相同集群键值的所有行。在索引的集群中,数据库将具有相同集群键值的所有行存储在相同的数据块中。要执行集群扫描,Oracle数据库首先通过扫描集群索引获得所选行的rowid。Oracle数据库然后根据这个rowid定位行。
◆哈希访问
数据库使用散列扫描来基于散列值定位散列集群中的行。在散列集群中,具有相同散列值的所有行都存储在相同的数据块中。要执行散列扫描,Oracle数据库首先通过向语句指定的集群键值应用散列函数来获得散列值。然后,Oracle数据库扫描包含具有该散列值的行的数据块。
◆表取样扫描
表采样扫描从简单表或复杂的SELECT语句(例如涉及连接和视图的语句)中检索随机数据样本。当语句的FROM子句包含SAMPLE子句或SAMPLE块子句时,数据库使用此访问路径。为了在使用sample子句对行进行抽样时执行sample表扫描,数据库将读取表中指定百分比的行。为了在使用sample BLOCK子句对块进行抽样时执行sample表扫描,数据库将读取指定百分比的表块。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




