【发布时间】:2011-03-15 01:19:53
【问题描述】:
我有一个应该返回 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。
【问题讨论】:
-
它所做的很明显:第一个查询已经完全删除了与
mastersources和mastersource_function的连接以及 Where 子句中的过滤器。为什么这样做令人困惑。 -
更正,它已删除与
mastersources的连接。在第一个查询中,它仍然在 MF.function 上有过滤器,但显然缺少连接。 -
@Thomas,是的,我也是这么想的,但百万美元的问题就是为什么。
-
如果颠倒连接的顺序,是否能够重现结果差异?
-
@Thomas,查询最初是使用按 accountsource、mastersource、mastersource_function、accountenrollment 顺序的表编写的,我按照您在上面看到的重新排序,看看它是否有帮助。它没有。