【Oracle】看懂执行计划系列之其他执行计划
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)。