
Document 344135.1 Ordering of Result Data
Document 70135.1 Index Fast Full Scan Usage To Avoid Full Table Scans
◦ CBO 能使用 Index Skip Scan (INDEX_SS). 执行 INDEX_SS 不需要索引前置列。请参照:
Document 212391.1 Index Skip Scan Feature
◦ CBO 能够选用一个索引来避免排序,但是索引列必须存于在 order by 子句中才可以。
请参照
Document 67409.1 When will an ORDER BY use an Index to Avoid Sorting?
Document 10577.1 Driving ORDER BY using an Index
•
索引列是否用在连接谓词中(
join predicates
)?
例如,下面这个连接谓词定义了如何在表 emp 和 dept 的 deptno 列上做连接:
emp.deptno = dept.deptno
如果索引列是连接谓词的一部分,那么查询在执行时使用了哪种类型的连接?
◦ 哈希/排序合并连接(Hash / Sort Merge Join): 对于哈希连接和排序合并,在连接执行的时候,外部表的信
息还没有获得,因此无法进行对内部表的行检索。它的处理方式是将外部表和内部表分别查询后将结果合并。
哈希连接和排序合并的内部表不能通过连接的索引列单独被访问。这是连接类型的执行机制的限制。嵌套循环
连接有所不同,它们允许通过索引查询内部表的连接列。
◦ 嵌套循环连接(Nested Loops Join):嵌套循环连接读取外部表,然后利用所收集的信息访问内部表。该算法
允许对内部表基于索引进行查询。
只有嵌套循环连接(Nested loops join)允许索引在内部表中仅基于连接列进行查找。
另外,连接的顺序(join order)是否允许使用索引?
一个嵌套循环连接的外部表必须已经访问过,才可以在内部表中使用索引。查看 explain plan,以确定哪些访问路径
已经使用。由于这个限制,表的连接顺序是很重要的。
例如:如果我们通过"emp.deptno = dept.deptno"来对 EMP 和 DEPT 做连接,并且在 EMP.DEPTNO 有一个索
引,并假设查询中没有与 EMP.DEPTNO 相关的其他谓词,EMP 是在 DEPT 前被访问,然后没有值可用于在
EMP.DEPTNO 索引中查询。在这种连接顺序下,要想使用这个索引我们只能使用全索引扫描或索引快速全扫描。在
这种情况下,全表扫描(FTS)的成本可能更小。
•
索引列在
IN
或者多个
OR
语句中?
比如:
emp.deptno IN (10,23,34,....)
或
emp.deptno = 10
OR emp.deptno = 23
OR emp.deptno = 34
....
文档 1549181.1 https://support.oracle.com/epmos/faces/DocumentDisplay?_a...
第3页 共9页 2025/3/6 16:05
相关文档
评论