oracle 查询转换


1、子查询展开
    SINGLE-ROW(=,<,>,<=,>=,<>),EXISTS,NOT EXISTS,IN,NOT IN,ANY,ALL
    不能做子查询展开的通常会在SQL执行计划最后一步才执行,一般是FILTER类型计划,效率很差
    IN ,EXISTS, =ANY 可转换为半连接(SEMI JOIN)
    NOT IN, NOT EXISTS, <>ALL 可转换为反连接 (ANTI JOIN)
    展开2条件:展开后语义完全等价,内嵌视图的子查询必须COST低于原SQL才展开


2、视图合并
    简单视图合并(始终合并)
    外连接视图合并(作为外连接的驱动表 非驱动表但视图定义中只包含一个表)
    复杂视图合并(COST低于原SQL才合并)


3、星型转换 针对各纬度表的限制条件,等价改写子查询附加到事实表 通过位图索引间的操作提高效率


4、连接谓词推入 把条件加入原视图定义SQL内部 COST低于原SQL才推入


5、连接因式分解 提取公共部分,避免同一个表扫描2次(11.2新特性)


6、表扩展 分区表分区索引不可用时 单独处理此分区 相当于可用分区 UNION ALL 不可用分区(11.2新特性)  COST低于原SQL


7、表移除  外键关联 外连接 可以去除不必要的表


8、 IN OR 等价  OR改写时 UNION ALL LNNVL()
       IN-LIST ITERATOR  IN所在列上必须有索引
       IN-LIST EXPANSION/OR EXPANSION  可改写为UNION ALL COST低于原SQL才改写 (可以用到不同列各自索引、分区修剪等特性)
       IN-LIST FILTER  IN后是自查询不是常量集合并不做子查询展开
       子查询展开/视图合并

你可能感兴趣的:(Oracle,sql优化,sql)