1.什么是连接因式分解
连接因式分解是优化器处理带UNION ALL的目标SQL的一种优化手段,它是指优化器在处理
已UNION ALL连接的目标SQL的各个分支时,不再原封不动地分别重复执行每个分支,而是
会把各个分支中公共部分提出来作为一个单独的结果集,然后再和原UNION ALL中剩下
的部分做表连接。
连接因式分解在11gr2中被引入。如果不把UNION ALL中公共的部分提出来,则意味这这些公共
部分中所包含的表会在UNION ALL的各个分支中被重复访问;而连接因式分解则能够在很大程度
上避免这种重复访问现象的发生,当UNION ALL的公共部分所包含的数据量很大时,即便是只减少
一次对大表的重复访问,那也意味着执行效率上的巨大提升。
2.连接因式分解的SQL 样例。
select t2.prod_id as prod_id
from sales t2,customers t3
where t2.cust_id=t2.cust_id
and t3.cust_gender='MALE'
union all
select t2.prod_id as prod_id
from sales t2,customers t3
where t2.cust_id=t2.cust_id
and t3.cust_gender='FEMALE';
在oracle 10gr2中,SALES表将被访问2次。
在oracle11gr2中,SALES被访问一次,执行计划中出现:VIEW |VW_JF_SET@0F531EB5
JF是是 Join Factorization,表示连接因式分解。先将UNION ALL公共部分提取出来
然后和剩下的部分所形成的内嵌视图 VW_JF_SET@0F531EB5 做HASH连接。
--等价改写如下:
select t2.prod_id
from sales t2,
(select t3.cust_id as ITEM_1
from customers t3 wehre t2.cust_gender='MALE'
union all
select t3.cust_id as ITEM_1
from customers t3 wehre t2.cust_gender='FEMALE'
) VW_JF_SET@0F531EB5
where t2.cust_id=VW_JF_SET@0F531EB5.ITEM_1;
连接因式分解除了能够避免对公共部分中所包含的表做重复访问之外,还可以提供更多的
执行路径给优化器做选择,这就增加了走出更高效执行路径的可能性。
在Oracle11gR2及其后续的版本中,即使由于在视图定义SQL语句中包含了集合运算符UNION ALL
而导致Oracle不能对其做视图合并,Oracle也不一定会把该视图的定义SQL语句当作一个整体
来单独执行,因为此时Oracle还可能对其做连接因式分解。
3.总结
连接因式分解技术,使得UNION ALL的SQL减少访问大表的次数,提供更优秀的执行计划。
连接因式分解关键词:VIEW |VW_JF_SET;