详解表连接顺序和连接方式是否影响查询结果

两张表连接时,不论A连接B表,还是B表连接A表,连接结果的总数都不会改变,但如果多张表连接,甚至又有外联结时连接结果的总数是否会发生变化,且原因是什么,带着这个问题抓取产品库中的一条典型SQL进一步分析。
有三张表HQ_READ.UP_LOAD_SERLNO_0721 ,MCS_HQ.HI_SALE_CHNL ,MCS_HQ.MA_CHNL 分别叫T1,T2,T3
,T1里有23980条数据,如果按T1外联结T2,再内链接T3的顺序结果是4356条数据,
但现在按照自己的设想,SQL不变,但改变表连接顺序,看看是否会改变查询结果中数据的总数。查询结果设想已T1的数据为准,表连接顺序是T2,T3表自然连接后再与T1做外连接,总数是T1表的数据条数23980,所以我用hint方式改变表连接顺序
执行计划也显示T2和T3内链接,再和T1外联结,因此我认为最后外联结出来的数据应该是23980条数据,但结果依然是4356条数据,我们看详细的执行计划,如下列出了两种情况,例1是T1,T2外联结后再与T3做自然连接的顺序对应的执行计划,例2是用hint改变了连接顺序T2,T3自然连接后再与T1外联结对应的执行计划。

例1 未改变表连接顺序,预计4356条数据,实际4356条数据
SQL> SELECT COUNT(*)
2 FROM MCS_HQ_READ.UP_LOAD_SERLNO_0721 T1
3 ,MCS_HQ.HI_SALE_CHNL T2
4 ,MCS_HQ.MA_CHNL T3
5 WHERE T1.SERL_NO = T2.SERL_NO(+)
6 AND T2.UPPR_SHOP_SUPP_CHNL_ID = T3.CHNL_ID
7 ;

执行计划
----------------------------------------------------------
Plan hash value: 3070468476
--------------------------------------------------------------------------------
-----------------------------------------------------
| Id | Operation | Name | Rows | By
tes |TempSpc| Cost (%CPU)| Time | Pstart| Pstop |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值