我有一个具有以下结构的查询:
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语句中使用子查询而不是内部联接是否值得?
答案 0 :(得分:1)
据我了解:
因此 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行,那么在几乎任何情况下,相关子查询都会更好。