(在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
?
(在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
?
当前回答
不!同样的执行计划,请看下面两个表:
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更清楚地表达了意图。因此,它可能会在当前oracle版本的某些情况下帮助查询优化器(我不知道它是否有用),它可能会在oracle的未来版本中帮助查询优化器(没有人知道),或者如果你改变数据库供应商,它可能会有帮助。
它们在逻辑上是相同的,但是在采用ANSI语法的Oracle早期版本中,在更复杂的情况下经常会出现错误,所以在使用它时有时会遇到来自Oracle开发人员的阻力。
尽管两个查询的身份似乎很明显,但有时会发生一些奇怪的事情。在Oracle 10g中将连接谓词从join移动到WHERE时,我遇到了具有不同执行计划的查询(对于WHERE计划更好),但我无法在简化的表和数据中重现此问题。我认为这取决于我的数据和统计。优化器是一个相当复杂的模块,有时它表现得很神奇。
这就是为什么我们不能一般地回答这个问题,因为它取决于DB内部。但我们应该知道,答案必须是“没有区别”。
在表采用第三范式的场景中,表之间的连接不应该改变。即加入客户和付款应始终保持不变。
但是,我们应该将连接与过滤器区分开来。联接是关于关系的,而过滤器是关于划分整体的。
一些作者,参考标准(即吉姆梅尔顿;艾伦·r·西蒙(1993)。理解新的SQL:完整指南。摩根考夫曼。11 - 12页。ISBN 978-1-55860-245-8.)写了在FROM子句中采用JOIN语法而不是逗号分隔表的好处。
我完全同意这个观点。
有几种方法可以编写SQL并达到相同的结果,但对于许多进行团队工作的人来说,源代码的可读性是一个重要方面,当然,从澄清源代码的意义上讲,将表之间的关系从特定的过滤器中分离出来是一个巨大的飞跃。
从功能上讲,它们是相同的。不过,我同意使用连接更好地描述您想要做的事情。很多时候,我认为我知道我想如何查询一些东西,直到我开始做连接,并意识到我想做一个不同于我头脑中的原始查询。