【问题标题】:SQL Joins vs Subquery - performance differenceSQL 连接与子查询 - 性能差异
【发布时间】:2019-08-06 17:55:04
【问题描述】:

执行速度更快 - 编写联接还是执行子查询? 喜欢

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

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

【问题讨论】:

    标签: sql oracle query-performance


    【解决方案1】:

    真的没有办法回答这个问题。你想错了。 SQL 查询不是关于如何 检索您想要的结果集的数据库指令,相反,它是您想要的数据的描述。如何获取它取决于数据库。

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

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

    你所拥有的很好,可能是我自己写的查询。您不仅有一个子查询,还有一个scalar subquery,它最好只返回一行或零行。所以,如果你的fieldXValue 在表中不是唯一的,你就会得到一个异常。

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

    【讨论】:

    • 这是一个很好的答案。
    【解决方案2】:

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

    【讨论】:

    • 并非总是如此。对于问题中的给定示例,您是对的,但是有很多示例表明相关子查询或“with”子句可以更快;取决于表的大小,从每个表中选择的行数等。
    • 适合各种情况的工具
    • 感谢@MarkStewart 和Jackal - 那么关于何时使用子查询以及何时使用联接的共识/专家意见是什么?
    • 很多关于何时使用哪个变量的变量,但通常/通常/有时如果一个表很小(并且您的连接列在两个表上都有索引)并且一个很大,相关的子查询将速度更快,但 Oracle 的所有事情都没有铁定的规则,因此最好同时测试两者。 (并且在测试时,将每个查询运行几次以“启动泵”)。
    猜你喜欢
    • 2011-04-20
    • 2016-08-19
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    相关资源
    最近更新 更多