这里是我的查询:为什么此查询会导致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