JOIN ON与WHERE中的Oracle SQL查询过滤器

inv*_*igo 5 sql oracle performance inner-join where

对于内连接,在JOIN ON子句或WHERE子句中应用过滤器的性能是否有任何差异?哪个会更高效,还是优化器会使它们相等?

加入

SELECT u.name
FROM users u
JOIN departments d
ON u.department_id = d.id
AND d.name         = 'IT'
Run Code Online (Sandbox Code Playgroud)

VS

哪里

SELECT u.name
FROM users u
JOIN departments d
ON u.department_id = d.id
WHERE d.name       = 'IT'
Run Code Online (Sandbox Code Playgroud)

Oracle 11gR2

Jus*_*ave 8

应该没有区别.优化器应该在两种情况下生成相同的计划,并且应该能够在连接之前,之后或期间应用谓词,在任何一种情况下都基于该特定查询的最有效方法.

当然,事实优化可以做一些事情,一般来说,是不能保证优化器做一些实际的特定查询.随着查询变得越来越复杂,不可能彻底地考虑每个可能的查询计划,这意味着即使有完美的信息和完美的代码,优化器也可能没有时间做你想做的所有事情.您需要查看为两个查询生成的实际计划,以查看它们是否实际相同.

  • @WillMarcouiller - 我认为没有人在讨论将连接谓词放在`WHERE`子句中而不是使用SQL99连接语法.这个问题只是将过滤谓词放在join子句而不是`WHERE`子句中.当然,Oracle采用SQL99连接语法相对较晚,并且解析器的前几个版本存在一些错误,导致旧式语法更有效,至少有时候.这在11.2中可能不是一个问题,但它确实让一些人对新语法感到厌烦. (4认同)
  • 此外,“WHERE”子句中的连接表包含有关 SQL89 的旧式语法。从 SQL92 及更高版本开始,为了可读性,鼓励使用“JOIN”语法,而不是为了性能,因为它们应该执行相同的操作,具体取决于其复杂性。 (2认同)