两张表连接时,不论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 |