与SQL等价物相比,LINQ语句的性能是否较差?

时间:2017-05-12 03:38:07

标签: c# linq linq-to-sql

在一些场景中,我观察到,通过SQL Server Profiler测量的LINQ语句的性能不到同一查询的SQL语句的一半。是这种情况总是或可能是由于LINQ语句的构造不良?

以下是SQL查询及其LINQ版本的示例,其中存在主要的性能差异: -

|id | persID | name | salary |    date   | LevelId |departmentID |
|---|--------|------|--------|-----------|---------|-------------|   
| 1 | 1      | John | $500   |2017/03/01 |  1      |   1         |
| 2 | 2      | Mary | $300   |2017/03/01 |  2      |   1         |
| 3 | 3      | Alice| $550   |2017/03/01 |  1      |   1         |
| 4 | 2      | Mary | $300   |2017/02/01 |  2      |   1         |
| 5 | 1      | John | $450   |2017/02/01 |  1      |   1         |
| 6 | 3      | Alice| $500   |2017/02/01 |  1      |   1         |

表: persDetails

|id | LevelName | level |
|---|-----------|-------|
| 1 |   CEO     |  1    |
| 2 |   CTO     |  1    |
| 3 |General Mgr|  2    |

表:级别

|id | persID | name | salary |    date   | LevelId |
|---|--------|------|--------|-----------|---------| 
| 1 |  1     | John | $500   |2017/03/01 | 1       |
| 2 |  3     | Alice| $550   |2017/03/01 | 1       |

预期结果

{{1}}

1 个答案:

答案 0 :(得分:3)

然后将LINQ语句转换为纯SQL查询。您可以使用SQL Server Profiler查看LINQ生成的查询,并将其与手写进行比较。通常,LINQ查询与手写一样高效,但并非总是如此 - 它是一个自动生成的查询,并不总是完全符合任何要求。

谈论您的疑问时,它们只是不同,可能导致不同的结果。您的LINQ查询比SQL查询复杂得多 - 它有更多的选择和连接,并使用连接来查找最大日期。它必须性能较差。

以下LINQ查询将完全类似于您的SQL查询:

var result = from p in persDetails
             join q in level on p.levelId equals q.level
             where q.level == 1 and p.date == persDetails.Max(x => x.date)
             select p;

它将导致类似的查询,并且应该花费相同的时间来执行。