(在oracle中)在性能上有区别吗

Select * from Table1 T1 
Inner Join Table2 T2 On T1.ID = T2.ID

And

Select * from Table1 T1, Table2 T2 
Where T1.ID = T2.ID

?


当前回答

今天,当我在生产环境中检查我们的一个sp的超时时,我遇到了这个难题,将一个从XML提要构建的表上的内部连接更改为“where”子句....现在执行1000次的平均执行时间是80ms,而以前的平均执行时间是2.2秒……执行计划的主要区别是取消了键查找…除非你用这两种方法测试过,否则你不会知道答案。

欢呼。

其他回答

尽管两个查询的身份似乎很明显,但有时会发生一些奇怪的事情。在Oracle 10g中将连接谓词从join移动到WHERE时,我遇到了具有不同执行计划的查询(对于WHERE计划更好),但我无法在简化的表和数据中重现此问题。我认为这取决于我的数据和统计。优化器是一个相当复杂的模块,有时它表现得很神奇。

这就是为什么我们不能一般地回答这个问题,因为它取决于DB内部。但我们应该知道,答案必须是“没有区别”。

如果查询优化器的工作是正确的,那么这些查询之间应该没有区别。它们只是指定相同期望结果的两种方法。

性能应该是相同的,但我建议使用连接版本,因为在涉及到外部连接时提高了清晰度。

另外,使用连接版也可以避免无意的笛卡尔积。

第三个效果是使用更简单的where条件更容易读取SQL。

它们在逻辑上是相同的,但是在采用ANSI语法的Oracle早期版本中,在更复杂的情况下经常会出现错误,所以在使用它时有时会遇到来自Oracle开发人员的阻力。

就像kiewik说的,执行计划是一样的。

JOIN语句只是更容易阅读,使它更容易不忘记ON条件和得到笛卡尔积。在使用多个连接类型的长查询中,这些错误很难检测到:SELECT * FROM t1, t2 WHERE t1.id=t2.some_field。

如果你只忘记了一个连接条件,你会得到一个很长的执行查询,返回太多的记录…真的太多了。有些人使用DISTINCT来修补查询,但执行起来仍然很长。

这就是为什么使用JOIN语句肯定是最佳实践:具有更好的可维护性和更好的可读性。

此外,如果我没记错的话,JOIN在内存使用方面进行了优化。