select与internaljoin中子查询的SQL查询效率

select与internaljoin中子查询的SQL查询效率,sql,sql-server,subquery,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 SELECT Id FROM Table1 LEFT OUTER JOIN (SELECT COUNT(1) AS [A1], [Extent4].Id2 FROM

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

SELECT 
    Id,
    (SELECT COUNT(1) AS [A1]
     FROM [dbo].Table2 AS [Extent4]
     WHERE (Table1.Id = [Extent4].Id2)) AS [C1]
FROM TPO_User
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
LINQ通常使用此查询结构,而不是以下结构:

SELECT 
    Id,
    (SELECT COUNT(1) AS [A1]
     FROM [dbo].Table2 AS [Extent4]
     WHERE (Table1.Id = [Extent4].Id2)) AS [C1]
FROM TPO_User
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语句中使用子查询而不是内部联接是否值得

  • FROM子句是目标的定义
  • SELECT子句是投影(逐行)定义
因此,FROM子句将您需要的数据加载到内存中,然后在select语句的每一行上进行投影

因此,如果在SELECT子句中执行查询(或调用函数…),则表示希望为投影的每一行执行此子作业。似乎很重;)

关于SQL请求的运行顺序的一点来源:

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


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

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

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

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


一般来说,哪个性能更好?好的,设计相关子查询更好的场景很简单。例如,如果
TPO_User
有1行,而
Table2
有1000000行,那么在几乎任何情况下,相关子查询都会更好。

您需要一个左连接来获得不存在的Table2行的相同结果。您确定要使用MySQL吗?该代码看起来更像MS SQL Server或Sybase。@jarlh:是的,正确。这应该是一个左连接。(这并没有真正改变我问题的重要性,因为查询速度的差异仍然存在)。好的,在第二次查询中,计数不在最终结果中。这样子查询就可以优化了。至少在理论上是这样。我不知道优化器是否捕捉到了这一点。两个查询可能优化到相同的东西,但一般来说,应该避免相关子查询,除非没有其他方法。第二个联接选项为比第一个选项进行更多优化(例如索引)打开了大门。