我正在使用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 ...现在效率低于第二种选择吗?
答案 0 :(得分:3)
您应该能够通过查看为SSMS中的两个查询生成的查询计划来自行确定。专门查看正在进行的任何扫描而不是搜索。
然后,您可以分析SQL事件探查器中的两个查询,以查看哪个查询生成的总读取次数更少,并且消耗更少的CPU周期。
答案 1 :(得分:0)
第一种方法可能涉及一种排序(不同),这表明当每个请求的提交数量很大时,EXISTS备选方案将表现得更好。
挂钟告诉你什么?