暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

解读执行计划五

原创 由迪 2020-06-22
1883

o INDEX (SAMPLE FAST FULL SCAN)
索引快速完全取样扫描。与抽样访问表类似,即以多数据块读取的方式扫描索引的部分数据块。
image.png

o INDEX (FULL SCAN)
全索引扫描,即对索引进行完全扫描访问。

这种访问方式与索引快速完全扫描的区别在于:
1、它是按照索引数据的逻辑顺序而不是物理存储顺序读取;
2、每次只能读取一个而不是多个数据块

o INDEX (FULL SCAN (MIN/MAX))
对索引进行完全扫描访问,以获取索引字段的最大、最小值。
image.png
image.png

o INDEX (FULL SCAN DESCENDING)
以索引逻辑顺序相反的顺序对索引进行完全扫描访问。
image.png

o INDEX (SKIP SCAN)
跳跃索引扫描,即对多字段复合索引扫描时,跳过索引中前导的一个或多个字段,而对后续字 段进行匹配。

提示:在建立多字段复合索引时,Oracle 会先按字段的顺序构建索引树,如果新数据记录的第一个字段值与索引中已有数据记录的第一个字段值相同,则会对第二个字段进行匹配来排序,以此类推。如果索引中的前导字段(可以是一个或者多个)的可区分数值非常少,即大多数数据记录拥有相同 的数值,那么构建的索引树的逻辑结构,大多数都是由后续字段的顺序决定。而在这种情况下,一个查询条件中只含有后续字段的过滤条件的话,在对索引进行扫描时,可以将索引树视为多个小的 索引数进行扫描,这种扫描方式就是跳跃索引扫描。

image.png

image.png

o INDEX (SKIP SCAN DESCENDING)
以复合索引的前导字段逻辑顺序的相反顺序进行跳跃索引扫描。

image.png

o BITMAP INDEX (SINGLE VALUE)
位图索引单值范围,即对位图索引中的一个键值进行匹配访问。

关键词释义:

位图索引:在 Oracle 中,存在两种数据结构的索引,一种是普通索引,以 B*树结构构建索引,整
个索引是树状结构,在叶子节点(即最底层节点)上存储索引记录,每条索引记录中包含了索引字 段值和对应数据记录的 ROWID,表中的每条数据记录(索引字段非空)在索引中都有一条索引记
录,如果索引字段数值相同,则按 ROWID 顺序存储;另外一种是位图索引,位图索引也是树状的,
但是它并不是对表中的每条数据记录都构建一条索引记录,而是将多个物理位置连续的数据记录映射到一条索引记录中,在叶子节点中,索引记录中除了索引字段值外,还包括其映射的多条表数据记录的起始地址和结束地址,最重要的是,它还包含一个位图,位图的每一个(bit)按序对应了一 条表记录,位的值为 1 的话,说明表记录中的索引字段数值与索引记录中的数值相同,为 0 则表示表记录与索引记录的索引字段值不匹配。我们会在后面章节详细介绍位图索引的存储方式。

要注意的是,位图索引包含了索引字段为空的数据记录。
image.png

image.png

在 Oracle(9i 及以上版本)中,还有一种特殊的位图索引:位图关联索引(Bitmap Join Index)。创建这样的位图索引时,可以与其他表的相关字段进行关联。在对他们以索引字段作为过滤条件进 行关联查询时,就可以避免对关联表的读取。创建了位图关联索引后,Oracle 会在创建索引的表上建立一个隐藏的虚拟字段,用于优化器选择和生产对应的访问路径。

image.png

o BITMAP INDEX (RANGE SCAN)
位图索引范围扫描,即对位图索引中的多个键值进行匹配访问。

image.png

o BITMAP INDEX (FULL SCAN)
位图索引完全扫描,扫描方式与普通索引完全扫描类似。
image.png

o BITMAP INDEX (FAST FULL SCAN)
位图索引快速完全扫描,扫描方式与普通索引快速完全扫描类似。

image.png

固态表访问操作

o FIXED TABLE (FULL)
固态表完全扫描。

关键词释义:

固态表是 Oracle 中的一种特殊表,它们以 X开头,属于 SYS 用户。它们存储是的 Oracle 实例内部 使用的运行数据,如一些性能统计数据、latch 信息等;在实例启动时加载到内存中,并在数据库的运行过程中动态添加删除,在实例关闭时被释放。系统中所有固态表可以由视图 vfixed_table 查询得到。除 sys 用户,其他用户都不能直接查询固态表,只能通过视图查询

image.png
image.png

o FIXED TABLE (FIXED INDEX)
访问固态表上的固态索引。
image.png

o FAST DUAL
快速访问 DUAL 表。

提示:DUAL 表是 Oracle 中的一个特殊表,它只有一个字段、一条记录。有时候,我们需要通过
SQL 来获取一些特殊数据,如当前系统时间、一个表达式的结果等,可以通过 SELECT FROM DUAL 的方式获取。而实际上,我们不关心 DUAL 表本身的数据,只是通过它来构造出一条完整的语句。在 FAST DUAL 出现(10G)之前,Oracle 还是需要实际的读取一次 DUAL 表以完成一个语句的生命周期。引入 FAST DUAL 以后,则不需要去真正访问 DUAL 表,而是通过虚拟的访问直接返回给上一层调用者。

image.png
注意,如果 select 后的表达式中含有 dual 表的字段(dummy,或者*)时,还是会实际读取dual 表的。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论