Oracle SQL性能优化

         对于被连接的数据子集较小的情况,nested loop连接就是较好的选择。nested loop就是扫描一个表,每读到一条记录,就根据索引去另外一个表里面查找,没有索引一般就不会是nested loops。
一般在nested loop中,驱动表满足条件结果集不大,被驱动表的连接字段要有索引,这样就走nested loop。
如果驱动表返回记录太多,就不适合nested loop。如果连接字段没有索引,则适合走hash join,因为不需要索引。

驱动表一定是小表,指的是根据条件获得的子集合一定要小,而不是说实体表本身一定要小,大表如果获得的子集合小,一样可以简称这个大表为驱动表。 ,最好选择与其他表的主键字段进行比较,或者与已经索引的字段进行比较,这样一来,就有意识地将业务需求的主表,作为驱动表处理了,Oracle也会在选择最优执行计划时,比较容易的找到驱动表。如果WHERE条件过于复杂,或者业务上获得信息的主表并不容易确定,我们可以根据业务的实际情况,评估关联各表的数据量和数据增长量,并分析关键条件字段的区分度,考虑在区分度高的字段,或者区分度高的组合字段上创建索引,以最大限度的降低某个表的结果集,增加其作为驱动表的机会。


设置最先扫描表的表
选择记录数最少的表作为第一个扫描的表
Select /*+ leading(a) */from a,b
Where a.id = b.id

驱动表(driving table/outer table)又称外层表,驱动表用于nested_loop join 和hash join,驱动表是用来驱动查询的,再CBO中,优化器会根据cost自动选择驱动表,并非根据表的顺序。

在RBO的优化模式下,对于两个表的操作中,RBO选择最右的表作为驱动表,对于三个或三个以上的表,RBO选择以从右至左的顺序处理表连接,也就是from中最右端的表作为驱动表。对于NESTED LOOPS,HASH JOIN,SORT MERGE JOIN方式,驱动表以小表的话查询速度会更快(更为确切的说,以经过where条件过滤后的结果集小的表作为驱动表),如果涉及到多个表进行关联的话,驱动表应该选择关联次数最多的表。

在oracle中改变表连接的hint有ordered和leading,ordered表示根据from后面写的表的顺序作为连接,以上面的hint为例分开写思路会清晰些。ordered后from t1,t2,t3,t4说明首先使用t1作为驱动表,使用hint use_hash(t2)代表连接t2的方式是hash join;然后用use_hash(t3)表示t3的方式是hash join,以swap_join_inputs(t3)代表t3做build表和t1-t2结果集做连接,依次类推。leading可以用来替换ordered,后面无需跟from,直接leading(t1,t2,t3,t4),也可以leading(t1)表示以t1作为驱动表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值