对于内部联接,在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
答案 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分钟才能取消执行,但没有结果。