选择与内部联接中子查询的SQL查询效率

时间:2019-04-26 09:22:24

标签: sql sql-server subquery

我有一个具有以下结构的查询:

SELECT 
    Id,
    (SELECT COUNT(1) AS [A1]
     FROM [dbo].Table2 AS [Extent4]
     WHERE (Table1.Id = [Extent4].Id2)) AS [C1]
FROM TPO_User

LINQ通常使用此查询结构,而不是以下结构:

SELECT Id
FROM Table1
LEFT OUTER JOIN
    (SELECT COUNT(1) AS [A1], [Extent4].Id2
     FROM [dbo].Table2 AS [Extent4]
     GROUP BY [Extent4].Id2) AS [C1] ON C1.Id2 = Table1.Id

当我比较它们时,第二个查询的持续时间较短。有人可以解释执行这种查询的确切区别吗?

在您的select语句中使用子查询而不是内部联接是否值得?

2 个答案:

答案 0 :(得分:1)

据我了解:

  • FROM 子句是目标的定义。
  • SELECT 子句是投影(逐行)定义。

因此 FROM 子句将所需的数据加载到内存中,然后在select语句的每一行上进行投影。

因此,如果您在 SELECT 子句中进行查询(或调用函数...),则表示您希望对投影的每一行都完成此子作业。似乎很重;)

有关SQL请求的运行顺序的一些资料:https://www.periscopedata.com/blog/sql-query-order-of-operations

希望这会有所帮助(如果我错了,请不要犹豫,让别人纠正我)

(如果我还记得的话,现在有一个自动功能可以优化sql server中的查询。我认为它会自行进行更正,不是吗?)

答案 1 :(得分:1)

我希望两个查询都具有相似的性能特征。在进行性能比较时,必须确保正确进行了比较。例如,连续运行两个查询不是一个很好的比较,因为表数据已加载到内存中。

要真正比较查询,您需要静态服务器和冷缓存。也就是说,执行计划可以帮助您了解正在发生的事情。

我希望相关的子查询在正确的索引下具有良好的性能。例如,您要在Table2(Id2)上建立索引。

哪个总体上表现更好?好吧,设计相关子查询更好的方案很简单。例如,如果TPO_User有1行,而Table2有1,000,000行,那么在几乎任何情况下,相关子查询都会更好。