(在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

?


当前回答

使用JOIN可以使代码更容易阅读,因为它是自解释的。

速度上没有区别(我刚刚测试过),执行计划是一样的。

其他回答

不!同样的执行计划,请看下面两个表:

CREATE TABLE table1 (
  id INT,
  name VARCHAR(20)
);

CREATE TABLE table2 (
  id INT,
  name VARCHAR(20)
);

使用内部连接的查询的执行计划:

-- with inner join

EXPLAIN PLAN FOR
SELECT * FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id;

SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);

-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2

以及使用WHERE子句的查询的执行计划。

-- with where clause

EXPLAIN PLAN FOR
SELECT * FROM table1 t1, table2 t2
WHERE t1.id = t2.id;

SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);

-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2

使用JOIN可以使代码更容易阅读,因为它是自解释的。

速度上没有区别(我刚刚测试过),执行计划是一样的。

[为了加分…]

使用JOIN语法允许您更容易地注释掉连接,因为它全部包含在一行中。如果要调试一个复杂的查询,这可能很有用

正如其他人所说,它们在功能上是相同的,但是JOIN更清楚地表达了意图。因此,它可能会在当前oracle版本的某些情况下帮助查询优化器(我不知道它是否有用),它可能会在oracle的未来版本中帮助查询优化器(没有人知道),或者如果你改变数据库供应商,它可能会有帮助。

在表采用第三范式的场景中,表之间的连接不应该改变。即加入客户和付款应始终保持不变。

但是,我们应该将连接与过滤器区分开来。联接是关于关系的,而过滤器是关于划分整体的。

一些作者,参考标准(即吉姆梅尔顿;艾伦·r·西蒙(1993)。理解新的SQL:完整指南。摩根考夫曼。11 - 12页。ISBN 978-1-55860-245-8.)写了在FROM子句中采用JOIN语法而不是逗号分隔表的好处。

我完全同意这个观点。

有几种方法可以编写SQL并达到相同的结果,但对于许多进行团队工作的人来说,源代码的可读性是一个重要方面,当然,从澄清源代码的意义上讲,将表之间的关系从特定的过滤器中分离出来是一个巨大的飞跃。

我不了解Oracle,但我知道旧的语法在SQL Server中被弃用了,最终会消失。在我在新的查询中使用旧语法之前,我会检查Oracle计划用它做什么。

我更喜欢更新的语法,而不是将连接标准与其他所需的where条件混合在一起。在新的语法中,创建连接的内容和应用的其他条件更加清晰。在这样的短查询中并不是一个大问题,但是当您有一个更复杂的查询时,它会变得更加混乱。由于人们学习基本的查询,我倾向于让人们在复杂查询中使用连接语法之前先学习使用它。

再次,我不知道Oracle,但我知道SQL Server版本的旧风格左连接是有缺陷的,甚至在SQL Server 2000,并给出不一致的结果(有时左连接有时交叉连接),所以它不应该被使用。希望Oracle不会遇到同样的问题,但可以肯定的是,左右连接在旧语法中很难正确表达。

另外,根据我的经验(当然,这完全是个人观点,你可能有不同的经验),使用ansi标准连接的开发人员倾向于更好地理解连接是什么以及它在从数据库中获取数据方面的意义。我相信这是因为大多数对数据库有良好理解的人倾向于编写更复杂的查询,而在我看来,使用ANSII标准比旧风格更容易维护。