查看sql执行计划的执行顺序: 先从最开头一直连续往右看,直到看到最右边并列的地方,对不不并列的,靠右的先执行,如果看到并列的,就从上往下看,对于并列的部分,上面的先执行 oracle中常见的执行计划 一、表的常见执行计划1、table access full2、table access by user rowid3、table access by index rowid二、B tree索引相关的执行计划1、index unique scan2、index rang scan3、index full scan4、 index skip scan5、index fast full scan三、与位图索引相关的执行计划位图索引(物理存储结构为:被索引的键值,对应rowid的上限,对应rowid的下限,位图段(bitmap segment))位图段:最大只能为位图索引叶子块大小的1/2位图索引的物理存储结构,决定了位图索引的锁的粒度在位图段上,所以位图索引没有行锁,要锁就是锁位图段,而多个数据行可能对应同一个位图段,所以位图索引不适用高并发,频繁修改的OLTP,会导致严重的并发问题,甚至死锁位图索引相比btree的几个优势 1、位图段是压缩存储的,所以当索引列的distinct少是,位图索引会明显的节省存储空间2、需要在多个列上建索引,位图索引会显著减少空间3、位图所以可以快捷实现某些and 和or的操作,因为位图索引可以实现快捷的按位运算相关的执行计划1、位图索引单键值扫描bitmap index single value2、bitmap index rang scan3、bitmap index full scan4、 bitmap index fast full scan 5、bitmap and 6、bitmap or 7、bitmap minus 使用完位图索引后会将结果转换为rowid bitmap conversion to rowids 四、与表连接相关的执行计划hash joinnested loopsmerge join sort joinhash join antinested loops antimerge join anti sort join
hash join semi
nested loops semi
merge join semi sort join
五、其他典型的执行计划and equal (index merge)index joinview filter 一种改良的嵌套循环连接,不像嵌套循环连接那样,驱动结果集中有多少记录,就要访问多少次被驱动表 sort ,分以下几种,执行计划中出现了sort 不一定代表必须排序,比如sort aggregate 和buffer sort有可能就不排序sort aggregate sort unique sort join sort group by sort order by buffer sort(统计信息中的sort(memory)和sort(disk)对buffer sort不一定是准的,即使有数值,也可能排序,也可能不排序),需要通过类似10032事件,或者 select * from table(dbms_xplan.display_cursor('ggtpk4y6089ma',0,'advanced'));来查看具体的信息确定是不是排序了 union/union allunion all 仅对结果集做合并,union相当于先union all再对结果集sort unique concat connect byselect empno,ename,mgr from emp start with empno=7839 connect by prior empno=mgr 六、ORACLE里执行计划的稳定1、使用sql profile来稳定执行计划 dbms_sqltune 两种类型 automatic 和manual automatic不能锁定执行计划,需要与sql的原统计信息相结合,只能调整执行计划manual 可以很好的稳定执行计划,这是automatic所不具备的2、SPM (SQL PLAN MANAGEMENT)11G才有的新功能
