Spe*_* A1 2 sql oracle query-performance
什么是更快执行-编写联接或执行子查询?喜欢
select *
from table A
where A.fieldAValue =(select fieldAValue from table B where fieldXValue =101) ;
Run Code Online (Sandbox Code Playgroud)
我的理由是,选择正确的sql的决定还取决于表中数据的结构/定义方式。我是对还是错?
确实没有办法回答这个问题。您在想错了。SQL查询不是关于如何检索所需结果集的数据库指令,而是对所需数据的描述。如何获取它取决于数据库。
Oracle会将您的查询重写为执行计划。它会根据您的表,索引,约束,所收集的统计信息,甚至是根据数据进行猜测,来寻找认为最有效的计划。实际上,很有可能您可以使用联接和子查询来编写此查询,这将导致完全相同的执行计划和相同的性能。
我的建议是编写查询,以便易于理解发生了什么。只有当性能实际上很差时,您才需要担心它的性能。Oracle非常聪明,可能会找到一条比您想象的更好的数据路径。
您所拥有的一切都很好,也许我会开始写自己的查询。您不仅有一个子查询,而且还有一个标量子查询,该子查询的性能很好,因此最好只返回一或零行。因此,如果您fieldXValue在表中不是唯一的,您将得到一个例外。
标量子查询通常非常好使用。它们被缓存,因此即使结果集中有一百万行,查询也可能只运行一次。我会推荐这篇文章(以及Tom Kyte曾经写过的所有其他文章):关于缓存和传播SQL