這裏是我的查詢:爲什麼此查詢會導致Oracle中的MERGE JOIN CARTESIAN?
select count(*)
from email_prod_junc j
inner join trckd_prod t5 on j.trckd_prod_sk = t5.trckd_prod_sk
inner join prod_brnd b on t5.prod_brnd_sk = b.prod_brnd_sk
inner join email e on j.email_sk = e.email_sk
inner join dm_geography_sales_pos_uniq u on (u.emp_sk = e.emp_sk and u.prod_brnd_sk = b.prod_brnd_sk)
解釋計劃說:DM_GEOGRAPHY_SALES_POS_UNIQ和EMAIL_PROD_JUNC之間
笛卡爾加入。
我不明白爲什麼,因爲每個表都有連接條件。
合併連接笛卡爾實際上是否會導致性能問題,或者您只是不期望看到它?如果您正在加入的表中有一個表具有少量的行合併連接,則可以調用笛卡爾連接。另外,Oracle版本將會有所幫助,因爲從發佈到發佈,優化器都會發生很大的變化/改進。 – 2010-08-11 16:56:35
是的,查詢花了一分鐘才返回笛卡爾連接。一旦我添加了訂購提示,它會在<1s內返回。這是Oracle 10g。 Trckd_Prod和Prod_Brnd是小表,其他3個非常大。 – 2010-08-12 17:15:11
@MarkSherretta - 10g優化器被稱爲片狀,需要提示後續版本的優化器不需要。 11.1相當堅實 - 11.2更好。我沒有12個人的親身經歷,所以不能說這是怎麼回事。 – 2016-06-15 02:42:37