14.查询转换之--连接因式分解

连接因式分解是一种优化技术,用于减少UNIONALL查询中大表的重复访问,通过提取公共部分创建内嵌视图,提高Oracle数据库的执行效率。在11gr2及以上版本中,即使包含UNIONALL的视图定义不支持视图合并,也可能应用连接因式分解策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值