在一些场景中,我观察到,通过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}}
答案 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;
它将导致类似的查询,并且应该花费相同的时间来执行。