在 Oracle 中总是使用 join 子句好不好?

War*_*ren 1 sql oracle

我最近了解到在 Oracle 中我们可以做类似的事情

select t1.a, t2.b 
from table1 t1, table2 t2
where t1.x = t2.x
Run Code Online (Sandbox Code Playgroud)

这相当于

select t1.a, t2.b
from table1 t1
join table2 t2 on (t1.x=t2.x)
Run Code Online (Sandbox Code Playgroud)

是否有任何性能差异或是否有任何其他论据表明我们应该使用一种样式而不是另一种样式?

Wer*_*eit 5

一般来说,它们是相等的,但是较低的 - 也称为“ANSI 连接语法”应该是 Oracle 推荐的首选,并且出于许多其他原因,请参阅OUTER JOIN文档。

只有一个例外(我知道):当您创建MATERIALIZED VIEWwith 时,FAST REFRESH您必须使用旧的 Oracle 连接语法,否则无法进行 FAST REFRESH。

很久以前,我为此在 Oracle 中创建了一个 SR。Oracle 不认为这是一个错误,而是“缺乏文档”。据我所知,这个限制/错误仍未解决。

  • 当 Oracle 在 9i 中首次引入 ANSI 92 语法时,他们已经为旧语法编写了多年的查询优化规则。他们不是在幕后重写优化器,而是将 ANSI 92 SQL 转换为旧语法并对其进行优化。这会导致偶尔的性能异常,尤其是(并不奇怪)在外连接周围。多年来,这些异常现象大部分都消失了,但 [仍然有一些,所以要小心](https://jonathanlewis.wordpress.com/2010/12/03/ansi-argh/) (2认同)