内部查询比全子查询慢

问题描述:

任何人能提供一个例子或解释为何形式的查询:内部查询比全子查询慢

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 

如果语法ISN”原谅我t正确,但总体思路是最内层的查询实际上比包含最内层查询的子查询慢。

+4

由于内部查询中的数据在运行外部数据时被缓存?由于优化器选择了不同的访问路径?由于在解析两个查询时统计数据不同?如果你有一个真实的例子,那么看看这两个执行计划。 – 2015-01-26 23:00:01

+1

或者可能是因为c中没有行,col2 = 0?或者,也许第一个查询返回很多行,而第二个查询返回的数量很少,那么将结果返回给您的时间会更少? – Boneist 2015-01-27 08:33:16

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

一对夫妇的原因很明显:

一)指数起到数据库优化的重要组成部分。看起来这似乎并没有影响这些查询中的差异

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

我从你上面的例子中立即假设是缓存的情况。

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

您也可以检查执行计划。