【问题标题】:Which of these two SQL queries is more efficient?这两个 SQL 查询哪个更高效?
【发布时间】:2011-05-23 15:36:36
【问题描述】:

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

有两个表 Requests 和 Submissions,从 Requests 到 Submissions 是一对多的关系。因此,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...现在是否比第二种选择效率低?

【问题讨论】:

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


    【解决方案1】:

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

    挂钟告诉你什么?

    【讨论】:

    • 呵呵,我的数据库还没有填满,所以我想选择写 LINQ 查询来制作高效的 SQL
    • 大多数请求没有提交,但是当他们提交时......他们会有 5-20 个......给你一个想法,大约有 4000000 个请求和 50000 个提交
    【解决方案2】:

    您应该能够自己确定这一点,方法是查看为 SSMS 中的两个查询生成的查询计划。专门查找正在执行的任何扫描而不是搜索。

    然后,您可以在 SQL Profiler 中分析这两个查询,看看哪个生成的总体读取更少,消耗的 CPU 周期更少。

    【讨论】:

    • 啊,但是我用的是 MySQL 作为数据库,这些工具可以用吗?
    • 我尝试在 MySQL 中使用 EXPLAIN 关键字,但效果不如 SQL Profiler
    • @puffpio - 如果您使用的是 MySql,为什么您的问题有 TSQL 标签?
    猜你喜欢
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    相关资源
    最近更新 更多