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子句是投影(逐行)定义
(如果我记得很清楚的话,现在sql server中有一个自动优化查询的功能。我认为它可以自己进行更正,是不是?)我希望这两个查询具有相似的性能特征。在进行性能比较时,必须确保正确进行比较。例如,在一行中运行两个查询不是一个好的比较,因为表数据已加载到内存中 要真正比较查询,需要静态服务器和冷缓存。也就是说,执行计划对理解正在发生的事情有很大帮助 我希望相关子查询在索引正确的情况下具有良好的性能。例如,您希望在
Table2(Id2)
上建立索引
一般来说,哪个性能更好?好的,设计相关子查询更好的场景很简单。例如,如果
TPO_User
有1行,而Table2
有1000000行,那么在几乎任何情况下,相关子查询都会更好。您需要一个左连接来获得不存在的Table2行的相同结果。您确定要使用MySQL吗?该代码看起来更像MS SQL Server或Sybase。@jarlh:是的,正确。这应该是一个左连接。(这并没有真正改变我问题的重要性,因为查询速度的差异仍然存在)。好的,在第二次查询中,计数不在最终结果中。这样子查询就可以优化了。至少在理论上是这样。我不知道优化器是否捕捉到了这一点。两个查询可能优化到相同的东西,但一般来说,应该避免相关子查询,除非没有其他方法。第二个联接选项为比第一个选项进行更多优化(例如索引)打开了大门。