SQL联接vs子查询-性能差异

时间:2019-03-15 15:45:05

标签: sql oracle query-performance

什么是更快执行-编写联接或执行子查询? 像

select * 
from table A 
where A.fieldAValue =(select fieldAValue from table B where fieldXValue =101) ; 

我的理由是,选择正确的sql的决定还取决于表中数据的结构/定义方式。我是对还是错?

2 个答案:

答案 0 :(得分:8)

实际上没有办法回答这个问题。您在想错了。 SQL查询不是关于数据库如何检索所需结果集的指令,而是对所需数据的描述。如何获取它取决于数据库。

Oracle会将您的查询重写为执行计划。它会根据您的表,索引,约束,所收集的统计信息,甚至是根据数据进行猜测,来寻找认为最有效的计划。实际上,很有可能您可以使用联接和子查询来编写此查询,这将导致完全相同的执行计划和相同的性能。

我的建议是编写查询,以便易于理解发生了什么。只有当性能实际上很差时,您才需要担心它的性能。 Oracle非常聪明,很可能会找到比您想象的更好的数据路由。

您拥有的一切都很好,也许我会写我自己开始的查询。您不仅有一个子查询,而且还有一个scalar subquery,该子查询的性能很好,因此最好只返回一或零行。因此,如果您的fieldXValue在表中不是唯一的,则会出现异常。

标量子查询通常非常好用。它们被缓存,因此即使结果集中有一百万行,查询也可能只运行一次。我会推荐这篇文章(以及汤姆·凯特(Tom Kyte)曾经写过的所有其他文章):On Caching and Evangelizing SQL

答案 1 :(得分:1)

有时候在处理大数据时联接是理想的选择。一个只有几行的表,您可以只使用select和where作为子查询。最好知道何时使用它们。