(在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
?
当前回答
它们都是连接,做同样的事情。
在MySQL查询中,为什么使用join而不是where?
其他回答
不要忘记在Oracle中,如果连接键属性在两个表中命名相同,你也可以这样写:
select *
from Table1 inner join Table2 using (ID);
当然,这也有相同的查询计划。
它们应该完全一样。然而,作为一种编码实践,我宁愿看到Join。它清楚地表达了你的意图,
[为了加分…]
使用JOIN语法允许您更容易地注释掉连接,因为它全部包含在一行中。如果要调试一个复杂的查询,这可能很有用
正如其他人所说,它们在功能上是相同的,但是JOIN更清楚地表达了意图。因此,它可能会在当前oracle版本的某些情况下帮助查询优化器(我不知道它是否有用),它可能会在oracle的未来版本中帮助查询优化器(没有人知道),或者如果你改变数据库供应商,它可能会有帮助。
不!同样的执行计划,请看下面两个表:
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
就像kiewik说的,执行计划是一样的。
JOIN语句只是更容易阅读,使它更容易不忘记ON条件和得到笛卡尔积。在使用多个连接类型的长查询中,这些错误很难检测到:SELECT * FROM t1, t2 WHERE t1.id=t2.some_field。
如果你只忘记了一个连接条件,你会得到一个很长的执行查询,返回太多的记录…真的太多了。有些人使用DISTINCT来修补查询,但执行起来仍然很长。
这就是为什么使用JOIN语句肯定是最佳实践:具有更好的可维护性和更好的可读性。
此外,如果我没记错的话,JOIN在内存使用方面进行了优化。