看懂执行计划之其他执行计划
AND-EQUAL(INDEX MERGE)
INDEX MERGE 是指当 where 条件中出现针对多个不同索引列的等值条件,Oracle 会分别去扫描这些索引列,然后合并每个索引的集合,找到值相同的 ROWID 最后回表。
缺陷
涉及到的索引都为单列索引
索引都在查询中出现
谓词使用=关系符号连接
从 Oracle 10g 开始,and_equal 操作被废弃,Oracle 不再支持,这里废弃的含义并不是被彻底移除,而是说不再进行改进,通过 hints 仍然可以强制实现 Index Merge 的 and_equal 操作。
INDEX JOIN
对 index 进行关联,oracle 通过 hash index join 的方式实现了避免对表的访问.所有的数据都从索引中直接获得.它不受查询条件影响,可以是唯一索引,也可以是多列索引.
缺点
如果不是所有数据都能从索引获得,那么将不会使用 index join
VIEW
Oracle 在处理包含视图的 SQL 时,通常会根据该视图是否能做视图合并(View Merging),即 Oracle 在执行该 SQL 时可以直接针对该视图的基表,此时 SQL 的执行计划中很可能不会出现关键字”VIEW”
对于某些 SQL 而言,即使 Oracle 已经做了视图合并但其所对应的执行计划中可能还是会显示关键字”VIEW”
如果不能做视图合并,则 Oracle 将把该视图看作一个整体并独立地执行它,此时 SQL 的执行计划中将出现关键字”VIEW”
FILTER
FILTER 直译过来就是过滤、筛选的意思,它是一种特殊的执行计划。
FILTER 类型的执行计划实际上是一种改良的嵌套循环连接,FILTER的性能跟列值distinct数有关
执行过程
- 得到一个驱动结果集。
- 根据一定的过滤条件从上述驱动结果集中滤除不满足条件的记录。
- 结果集中剩下的记录就会返回给最终用户或者继续参与下一个执行步骤。
SORT
- SORT AGGREGATE
通常发生在使用一些聚合函数的时候,sum(),avg(),min(),max(),count()等等,实际上 sort aggregate 不做真正的 sort,并不会用到排序空间,而是通过一个全局变量+全表或全索引扫描来实现 - SORT UNIQUE
需要取 distinct 值的时候或 in 子查询 - SORT GROUP BY
发生在有 group by 子句的时候 - SORT ORDER BY
发生在有 order by 子句的时候 - SORT JOIN
发生在出现 merge join 的情况下,两张关联的表要各自做 sort,然后再 merge
UNION/UNION ALL
UNION 和 UNIONALL 的区别是 ∶UNION ALL 仅仅是简单地将两个结果集合并,并不做任何额外的处理;而 UNION 除了将两个结果集简单合并之外,还会对合并后的结果集做排序和去重,即 UNION 相当于先做 UNION ALL,然后再对 UNIONALL 之后的结果集做 SORT UNIQUE。
CONCAT
CONCAT 就是 IN-List 扩展(IN-List Expansion)或 OR 扩展(OR Expansion),IN-List 扩展/OR 扩展在执行计划中对应的关键字是”CONCATENATION”。
CONCATENATION 操作类似 union ,只不过与 union 不同的是他并不对全部数据去重.
CONCATENATION 操作只去除由 OR 引起的重复值.
CONNECT BY
CONNECT BY 是 Oracle 数据库中层次查询(Hierarchical Queries)。