【问题标题】:Discrepancy using subquery and join使用子查询和连接的差异
【发布时间】:2020-07-23 17:11:40
【问题描述】:

我正在尝试改进 Android 项目上的一些查询,并且我在许多网站上看到使用联接当然比使用子查询更快。 因此,我尝试更改一个使用 8 个子查询的查询,该查询使用 3 个左连接和 3 个选择。 在测试数据库上运行时,我发现第一个使用 8 个子查询比使用连接的更快。

我尝试运行 EXPLAIN QUERY PLAN 命令并得到以下结果:

使用子查询


使用连接



我在加入时做错了吗?为什么第一个查询比第二个更快结束? 注意:事实证明,在连接中不使用这 3 个选择非常困难,因为我需要计算某个数据出现了多少次。

【问题讨论】:

    标签: android sqlite android-sqlite


    【解决方案1】:

    答案很简单:确实使用 JOIN 总是比使用子查询快。相反,根据我的经验,更准确的说法是子查询更有可能被低效使用。

    更多信息:

    最终,如您所知,子查询和 JOIN 都被您的数据库引擎分解为一个查询计划。您的数据库引擎在查询计划中采用快捷方式,它认为可以根据它对 SQL 的解释方式。因此,您可以通过明确可以使用哪些快捷方式来提高 SQL 的效率。

    在您的情况下,您使用 JOIN 重写 SQL 的辛勤工作似乎使数据库引擎更难设计一个有效的查询计划。值得注意的是,基于 JOIN 的 SQL 包括一个(相对较慢的)AUTOMATIC COVERING INDEX;而对于基于子查询的 SQL,数据库引擎能够坚持使用现有的 PRIMARY KEY INDEX。

    也就是说,基于 JOIN 的查询计划确实看起来更短,因此如果您能够相应地构建 INDEX,它可能会运行得更快。

    【讨论】:

    • 你好。我花了所有时间试图找到解决此问题的最佳方法,但似乎我能做的最好的事情就是像以前一样将 Table4 用作子查询,保持其他更改。如果结果会更好,我还没有发现,但至少它可能不会更糟。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多