内联与何处

时间:2020-03-06 14:36:16  来源:igfitidea点击:

两者之间的性能(在oracle中)是否有区别

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

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

解决方案

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

在PostgreSQL中,它们都等同于相同的查询计划,绝对没有区别。我99%确信Oracle也是如此。

它们应该完全相同。但是,作为编码实践,我宁愿看到Join。它清楚地表达了意图,

它们都是内部连接,它们执行相同的操作,只是使用较新的ANSI语法。

从功能上讲,它们与前面所说的相同。我同意,尽管进行联接可以更好地准确描述我们要执行的操作。很多时候,我一直以为自己知道如何查询某些内容,直到我开始进行联接并意识到我想做的查询与我头脑中的原始查询不同。

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

我不了解Oracle,但我知道SQL Server中不赞成使用旧语法,并且最终将消失。在新查询中使用旧语法之前,我将检查Oracle计划如何使用它。

我更喜欢较新的语法,而不是将合并条件与其他需要的条件混合使用。在较新的语法中,更清楚地说明了什么创建了连接以及正在应用哪些其他条件。在像这样的简短查询中,这并不是一个大问题,但是当我们拥有更复杂的查询时,它会变得更加混乱。由于人们是在基本查询上学习的,所以我倾向于偏向人们在复杂查询中需要使用联接语法之前就学习使用联接语法。

再说一次,我不特别了解Oracle,但是我知道即使在SQL Server 2000中,旧样式的左连接的SQL Server版本也存在缺陷,并且结果不一致(有时左连接有时是交叉连接),因此永远不应该这样。用过的。希望Oracle不会遇到相同的问题,但是可以肯定的是,左右连接可能很难以旧语法正确表达。

另外,根据我的经验(当然,这完全是个人观点,我们可能会有不同的经验),使用ANSI I标准联接的开发人员倾向于更好地了解联接的含义以及获得联接的含义。数据从数据库中移出。我相信这是因为大多数具有良好数据库理解的人都倾向于编写更复杂的查询,而在我看来,使用ANSI I标准比使用旧样式更容易维护这些查询。

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

速度没有差异(我刚刚测试过),执行计划是相同的。

的确,从功能上来说,两个查询应以相同的方式处理。但是,经验表明,如果我们要从使用新联接语法的视图中进行选择,那么使用它来构造查询也很重要。如果视图使用" join"语句,则Oracle的优化器可能会感到困惑,但是访问该视图的查询使用" where"子句中的传统联接方法。

性能应该是相同的,但是我建议使用join-version,因为当涉及外部联接时,它会提高清晰度。

使用join版本也可以避免意外的笛卡尔积。

第三个效果是使用更简单的WHERE条件更易于阅读SQL。

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

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

不要忘记在Oracle中,只要两个表中的连接键属性都相同,我们也可以这样写:

select *
from Table1 inner join Table2 using (ID);

当然,这也具有相同的查询计划。

[加分...]

使用JOIN语法,我们可以更轻松地将联接注释掉,因为它全部包含在一行中。如果我们要调试复杂的查询,这可能会很有用

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