查询会进行笛卡尔连接,除非

时间:2011-03-15 01:19:54

标签: oracle join cartesian

我有一个应该返回2行的查询。但是,它返回48行。它表现得就像其中一个正在加入的表格不存在。但是,如果我将该表中的列添加到select子句中,而不更改查询的from或where部分,则返回2行。

以下是“解释计划”在选择中没有“m。*”的情况下说的: Explain Plan before

在选择中添加m。*之后再次出现: Explain Plan after

任何人都可以解释为什么它应该这样做吗?

更新:我们只在一个系统上遇到此问题,而不是另一个系统。 DBA验证了有问题的是运行optimizer_features_enable设置为10.2.0.5,而没有发生的是运行optimizer_features_enable设置为10.2.0.4。不幸的是,客户站点运行的是10.2.0.5。

2 个答案:

答案 0 :(得分:2)

这是关于10gR2中引入的连接消除:

  

表消除(交替称为   “加入淘汰”)消除了多余   来自查询的表。一张桌子   如果它的列是唯一的冗余   在连接谓词中引用,和   保证那些加入   既不过滤也不扩大   结果行。有几个   Oracle将消除a的情况   冗余表。

也许这就是那种相关的错误。请查看this文章。

答案 1 :(得分:0)

看起来像个错误。有什么限制?

逻辑上,如果MASTERSOURCE_FUNCTION中的所有行都具有NON-OSDA函数,那么不会排除任何行(或者如果没有任何行,则排除所有行)。

更进一步,如果MASTERSOURCE中的每一行在MASTERSOURCE_FUNCTION中都有一个或零个NON-OSDA行,那么它应该是排除的候选者。但是MASTERSOURCE ID和NAME之间也需要一对一。

我从ACCOUNTSOURCE获取48行的ROWID,然后跟踪MASTERSOURCE ID和NAME,看看这些行被复制或不被排除的原因。也就是说,在MASTERSOURCE中是否有12个重复的名称,它们通过NOVALIDATE约束预期是唯一的。