(在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
?
当前回答
的确,在功能上,这两个查询应该以相同的方式处理。但是,经验表明,如果您正在从使用新连接语法的视图中进行选择,那么使用该语法组织查询也很重要。如果视图使用了“join”语句,Oracle的优化器可能会感到困惑,但是访问视图的查询使用了传统的“where”子句连接方法。
其他回答
[为了加分…]
使用JOIN语法允许您更容易地注释掉连接,因为它全部包含在一行中。如果要调试一个复杂的查询,这可能很有用
正如其他人所说,它们在功能上是相同的,但是JOIN更清楚地表达了意图。因此,它可能会在当前oracle版本的某些情况下帮助查询优化器(我不知道它是否有用),它可能会在oracle的未来版本中帮助查询优化器(没有人知道),或者如果你改变数据库供应商,它可能会有帮助。
我不了解Oracle,但我知道旧的语法在SQL Server中被弃用了,最终会消失。在我在新的查询中使用旧语法之前,我会检查Oracle计划用它做什么。
我更喜欢更新的语法,而不是将连接标准与其他所需的where条件混合在一起。在新的语法中,创建连接的内容和应用的其他条件更加清晰。在这样的短查询中并不是一个大问题,但是当您有一个更复杂的查询时,它会变得更加混乱。由于人们学习基本的查询,我倾向于让人们在复杂查询中使用连接语法之前先学习使用它。
再次,我不知道Oracle,但我知道SQL Server版本的旧风格左连接是有缺陷的,甚至在SQL Server 2000,并给出不一致的结果(有时左连接有时交叉连接),所以它不应该被使用。希望Oracle不会遇到同样的问题,但可以肯定的是,左右连接在旧语法中很难正确表达。
另外,根据我的经验(当然,这完全是个人观点,你可能有不同的经验),使用ansi标准连接的开发人员倾向于更好地理解连接是什么以及它在从数据库中获取数据方面的意义。我相信这是因为大多数对数据库有良好理解的人倾向于编写更复杂的查询,而在我看来,使用ANSII标准比旧风格更容易维护。
它们在逻辑上是相同的,但是在采用ANSI语法的Oracle早期版本中,在更复杂的情况下经常会出现错误,所以在使用它时有时会遇到来自Oracle开发人员的阻力。
性能应该是相同的,但我建议使用连接版本,因为在涉及到外部连接时提高了清晰度。
另外,使用连接版也可以避免无意的笛卡尔积。
第三个效果是使用更简单的where条件更容易读取SQL。
的确,在功能上,这两个查询应该以相同的方式处理。但是,经验表明,如果您正在从使用新连接语法的视图中进行选择,那么使用该语法组织查询也很重要。如果视图使用了“join”语句,Oracle的优化器可能会感到困惑,但是访问视图的查询使用了传统的“where”子句连接方法。