我有一个应该返回2行的查询。但是,它返回48行。它表现得就像其中一个正在加入的表格不存在。但是,如果我将该表中的列添加到select子句中,而不更改查询的from或where部分,则返回2行。
以下是“解释计划”在选择中没有“m。*”的情况下说的:
在选择中添加m。*之后再次出现:
任何人都可以解释为什么它应该这样做吗?
更新:我们只在一个系统上遇到此问题,而不是另一个系统。 DBA验证了有问题的是运行optimizer_features_enable设置为10.2.0.5,而没有发生的是运行optimizer_features_enable设置为10.2.0.4。不幸的是,客户站点运行的是10.2.0.5。
答案 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约束预期是唯一的。