【问题标题】:Oracle SQL '+ 0' syntax for join?用于连接的 Oracle SQL '+ 0' 语法?
【发布时间】:2011-08-16 00:37:01
【问题描述】:

我使用 Toad 的 SQL 优化器,它在我的连接语句中添加了以下内容..

而不是说

emp.emplid = dept.emplid

建议

emp.emplid = dept.emplid + 0

“+ 0”有什么作用?我在网上搜索了过去一个小时,但找不到任何东西。我知道 (+) 的含义,但我从未见过这样的东西。

【问题讨论】:

  • 只是一个疯狂的猜测...emp.emplid 是一个整数,而dept.emplid 是一个字符串?

标签: sql oracle join


【解决方案1】:

+ 0 就像它的样子。它将 0 添加到 dept.emplid。但从性能的角度来看,这确实有所作为。通过将其转换为表达式,Oracle 无法在 dept.emplid 上使用任何索引。

因此,如果 Oracle 在 dept.emplid 上选择索引,但您希望它使用不同的索引/计划,那么添加 + 0 是一种影响优化器的方法,因为该特定列不再匹配.任何表达式都可以解决问题。

解决此问题的另一种方法是进入优化器提示。虽然这对于大型查询来说可能有点痛苦。

【讨论】:

  • 我希望你错了。一个试图超越 Oracle 优化器的工具,却没有准确解释它在做什么以及为什么这样做,这听起来像是在浪费时间和金钱。此外,在这种情况下,Oracle 仍然可以使用索引。
  • 考虑到查询从 1 分 30 秒到 0.8 秒,我会说它有效。 this article in the DailyWTF 底部有一条评论,进一步详细说明了这个答案。
  • @David:该建议来自 80 年代,针对基于规则的优化器。这个技巧现在可能对你有用,但不是很清楚,不适用于所有版本的 Oracle,也不能解决真正的问题(即为什么优化器如此错误)。
  • 此优化器提示表明源表中的索引存在问题。如果可能的话,我会在调整查询之前更改索引!
【解决方案2】:

'+0' 的作用是向优化器指示它应该使用另一个索引。换句话说,我很确定这两个字段之一(mp.emplid = dept.emplid)除了外键之外,还有另一个索引特定字段。同样,+0 取消了默认优化器(外键)采用的索引,并告诉它选择另一个索引。

【讨论】:

  • 欢迎并感谢您的回答! Stack Overflow 是一个英文网站;我在你的答案上使用了谷歌翻译,但可能有错误。你能检查一下它的准确性吗?
猜你喜欢
  • 1970-01-01
  • 2016-11-21
  • 2019-04-21
  • 2017-02-22
  • 2012-03-15
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多