在 Oracle 中,使用 SELECT *
和明确指定所需列的性能是否有差异?
Select * from Table1 T1
Inner Join Table2 T2 On T1.ID = T2.ID
并且
Select * from Table1 T1, Table2 T2
Where T1.ID = T2.ID
?
在 Oracle 中,使用 SELECT *
和明确指定所需列的性能是否有差异?
Select * from Table1 T1
Inner Join Table2 T2 On T1.ID = T2.ID
并且
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
更易于阅读,因为连接表的条件是直接在那里定义的,而不是在WHERE
子句中的“某个地方”定义的。我更喜欢将WHERE
子句保留用于限制数据集(例如 WHERE DATE > (SYSDATE - 1)
),而不是定义表之间的关系(例如 WHERE T1.ID = T2.ID
)。对于像问题中的示例这样的小表,几乎没有区别,但对于涉及多个表和多个条件的大查询,我认为这使查询更容易理解。 - ImaginaryHuman072889它们应该完全相同。然而,作为一种编码实践,我更倾向于使用 Join。这样可以清晰地表达您的意图。
使用 JOIN
使代码更易于阅读,因为它是自我解释的。
速度上没有差别(我刚刚测试过),执行计划也相同。
[额外加分...]
使用JOIN语法可以更容易地将连接注释掉,因为它们都包含在一行中。如果您正在调试复杂的查询,这可能很有用。
正如其他人所说,它们在功能上是相同的,但JOIN更清晰地表达了意图。因此,在某些情况下,它可能帮助当前Oracle版本中的查询优化器(我不知道是否有用),或者在未来的Oracle版本中可能有帮助(没有人知道),或者当你更改数据库供应商时可能有帮助。
我不知道Oracle的情况,但我知道在SQL Server中,旧语法已被弃用并将最终消失。在使用这种旧语法之前,我会先检查一下Oracle计划如何处理它。
我更喜欢新的语法,而不是将连接条件与其他必要的where条件混合在一起。在新的语法中,很清楚哪些内容创建了连接,以及应用了哪些其他条件。在短查询中这并不是一个大问题,但当您有一个更复杂的查询时,情况会变得更加混乱。因为人们从基本查询开始学习,所以我倾向于让人们在需要进行复杂查询之前学习使用连接语法。
再次强调,我不知道Oracle的具体情况,但我知道SQL Server版本的旧式左连接即使在SQL Server 2000中也存在缺陷,并会给出不一致的结果(有时是左连接,有时是交叉连接),因此不应使用。希望Oracle没有遇到同样的问题,但是在旧语法中,左连接和右连接可能更难正确表达。
此外,我的经验是(当然这仅仅是个人意见,你可能有不同的经验),使用ANSII标准连接的开发人员往往更好地理解连接与从数据库中获取数据的含义。我认为这是因为大多数具有良好数据库理解的人倾向于编写更复杂的查询,而使用ANSII标准比旧式连接语法更容易维护。
它们在逻辑上是相同的,但在早期采用ANSI语法的Oracle版本中,在更复杂的情况下使用它时常常会遇到错误,因此当你使用它时,有时会遇到来自Oracle开发人员的阻力。
select *
from Table1 inner join Table2 using (ID);
join
。 - MajidTaheriinner join
但是忘记了加上on
子句,会导致错误。然而,如果你在,
分隔的表中忘记了加上where
子句,它会返回一个交叉连接! - Shivam Tripathi