内部查询比完整子查询慢

时间:2015-01-26 22:01:50

标签: sql oracle join subquery

任何人都可以提供一个示例或解释为什么查询表单:

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

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

1 个答案:

答案 0 :(得分:0)

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

有几个明显的原因:

a)索引在数据库优化中起着很大的作用。它似乎不会影响这些查询中的差异

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

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

我建议你花一点时间让你的缓存清晰,然后尝试运行你的查询(在第一个之前运行第二个)你会发现它是反之亦然。

您还可以查看执行计划。