gpt4 book ai didi

sql - 在 Oracle 中添加冗余连接条件会导致不同的计划

转载 作者:行者123 更新时间:2023-12-04 17:59:41 27 4
gpt4 key购买 nike

我有一个常见的数据库连接情况,涉及三个表。一张表 A 是主表,主键名为 id .表 B 和 C 包含条目和 A 的辅助数据,并且每个表还有一个名为 id 的列。这是指向 A 的外键。id .现在,如果我想要在一个查询中来自 A、B 和 C 的所有数据,我会写:

SELECT *
FROM A
INNER JOIN B
ON B.id = A.id
INNER JOIN C
ON C.id = A.id

这当然很完美。

最近我们的DBA告诉我们,这在Oracle中效率很低,还需要在C和B之间加入条件,如下:
SELECT *
FROM A
INNER JOIN B
ON B.id = A.id
INNER JOIN C
ON C.id = A.id AND C.id = B.id

这对我来说看起来多余,所以我自然不相信这里。直到我真的遇到了一个执行计划很糟糕的慢查询,并设法通过准确添加缺少的连接条件来修复它。我在两个版本上都运行了解释计划:没有“冗余”查询条件的一个成本为 1035,而“改进”的一个有 389(基数和字节数也有巨大差异)。这两个查询产生了完全相同的结果。

谁能解释为什么这个额外的条件会有所不同?对我来说,C 和 B 甚至没有关系。另请注意,如果您取消其他连接条件,则同样糟糕 - 它们都需要在那里。

最佳答案

有趣的。

似乎 Oracle 只能在某些情况下推断出这种传递相等性:他们称之为 Transitive Closure当启用查询重写时,您应该能够从中受益。

但为了安全起见,最好自己拼出多余的谓词。

关于sql - 在 Oracle 中添加冗余连接条件会导致不同的计划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/993027/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com