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

时间:2014-08-15 16:22:35

标签: sql performance oracle 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'

VS

WHERE

SELECT u.name
FROM users u
JOIN departments d
ON u.department_id = d.id
WHERE d.name       = 'IT'

Oracle 11gR2

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:0)

我更喜欢将过滤条件放在where子句中。

使用数据仓库查询,将过滤条件放在join结果中,以使查询持续时间更长。

例如,我 Table1 按字段 日期 表2 <编制索引< / em> 按字段分区 分区 Table2 是查询中最大的表格是在另一个数据库服务器我使用 driving_site 提示告诉优化程序使用 Table2 分区。

select /*+driving_site(b)*/ a.key, sum(b.money) money
  from schema.table1 a
  join schema2.table2@dblink b
    on a.key = b.key
 where b.partition = to_number(to_char(:i,'yyyymm'))
   and a.date = :i
 group by a.key`

如果我以这种方式进行查询,则返回结果大约需要30到40秒。

如果我不以这种方式进行查询,则需要大约10分钟才能取消执行,但没有结果。