这两个SQL查询中的哪一个更有效?

时间:2010-12-10 18:04:13

标签: mysql linq tsql entity-framework linq-to-entities

我正在使用Entity Framework和Linq to Entities与MySQL ADO.Net连接器访问MySQL数据库。

有两个表请求和提交,其中包含从请求到提交的一对多关系。因此,Submissions表包含一个RequestId列,该列对Requests具有外键依赖性。

我需要检索其提交内容包含特定值的所有请求。在LINQ中,我可以通过以下两种方式之一完成:

var r1 = foo.Submissions.Where(s => s.FieldName == "foo" && s.FieldValue == "bar").Select(s => s.Request).Distinct();
var r2 = foo.Requests.Where(r => r.Submissions.Any(s => s.FieldName == "foo" && s.FieldValue == "bar"));

评估为

SELECT `Distinct1`.*
FROM
   (SELECT DISTINCT `Extent2`.*
    FROM `Submissions` AS `Extent1` INNER JOIN `Requests` AS `Extent2` ON `Extent1`.`RequestId` = `Extent2`.`RequestId`
    WHERE ("foo" = `Extent1`.`FieldName`) AND ("bar" = `Extent1`.`FieldValue`))
AS `Distinct1`

SELECT `Extent1`.*
FROM `Requests` AS `Extent1`
WHERE EXISTS
   (SELECT 1 AS `C1`
    FROM `Submissions` AS `Extent2`
    WHERE (`Extent1`.`RequestId` = `Extent2`.`RequestId`) AND ((@gp1 = `Extent2`.`FieldName`) AND (@gp2 = `Extent2`.`FieldValue`)))

现在第一种查询样式使用INNER JOIN ...现在效率低于第二种选择吗?

2 个答案:

答案 0 :(得分:3)

您应该能够通过查看为SSMS中的两个查询生成的查询计划来自行确定。专门查看正在进行的任何扫描而不是搜索。

然后,您可以分析SQL事件探查器中的两个查询,以查看哪个查询生成的总读取次数更少,并且消耗更少的CPU周期。

答案 1 :(得分:0)

第一种方法可能涉及一种排序(不同),这表明当每个请求的提交数量很大时,EXISTS备选方案将表现得更好。

挂钟告诉你什么?