SQL连接与子查询 - 性能差异

问题描述 投票:2回答:2

什么是更快的执行 - 编写连接或执行子查询?喜欢

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

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

sql oracle query-performance
2个回答
8
投票

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

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

我的建议是编写查询,以便很容易理解发生了什么。只有当表现真的很差时,你才会担心它在做什么。 Oracle非常聪明,可能会找到比您想象的更好的数据路径。

你有什么是好的,可能是我自己开始写的查询。你不仅有一个子查询,而且还有一个scalar subquery,它更好地返回一行或零行。因此,如果您的fieldXValue在表格中不是唯一的,您将获得例外。

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


1
投票

在处理大数据时,联接是理想的时刻。只有几行的表可以使用select和where子查询。最好知道何时使用每个。

© www.soinside.com 2019 - 2024. All rights reserved.