【问题标题】:Inner query slower than full subquery内部查询比完整子查询慢
【发布时间】:2015-03-25 10:08:43
【问题描述】:

谁能提供一个示例或解释为什么要查询表单:

SELECT a.col0
FROM a INNER JOIN b on a.id = b.id
WHERE b.cond = 0

会慢于:

SELECT c.col1 
FROM c 
WHERE c.col2 IN (
    SELECT a.col0
    FROM a INNER JOIN b on a.id = b.id
    WHERE b.cond = 0
) AND c.col2 = 0

如果语法不正确,请原谅我,但一般的想法是最里面的查询实际上比包含最里面的查询的子查询慢。

【问题讨论】:

  • 因为在运行外部查询时缓存了来自内部查询的数据?因为优化器选择了不同的访问路径?因为解析两个查询时统计信息不同?如果你有一个真实的例子,那么看看这两个执行计划。
  • 或者可能是因为 c 中没有 col2 = 0 的行?或者也许第一个查询返回很多行,而第二个返回少量,所以返回结果给你的时间更少?

标签: sql oracle join subquery


【解决方案1】:

老实说,这可能有几个原因。您需要对数据库优化有很好的了解,包括您的 DBMS(数据库管理系统)如何处理数据集。

几个明显的原因:

a) 索引在数据库优化中发挥着重要作用。这似乎不会影响这些查询中的差异

b) 缓存是许多数据库考虑的主题。如果您在同一个打开的连接上运行第一个查询(如上),然后运行第二个查询(与之前的查询非常相似并且使用相同的表),很可能该表已被缓存并且能够查询速度更快。

我从上面的示例中直接假设是缓存的情况。

我建议你花一点时间让你的缓存清除并尝试以相反的方式运行你的查询(在你第一个之前运行第二个),你可能会发现它是反之亦然。

您还可以查看执行计划。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-21
    • 2015-03-20
    • 2023-03-14
    • 1970-01-01
    • 2010-10-14
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多