.net - LINQ-to-SQL 中的 "Order By"导致性能问题

标签 .net linq-to-sql t-sql sql-server-ce

我已经开始在我的 C# 应用程序中编写一个方法,该方法可以从包含大约 2000 个名称的表中返回名称的有序子集,从第 100 个名称开始,返回接下来的 20 个名称。

我这样做是为了在 UI 中填充 WPF DataGrid 并执行一些自定义分页。我一直在使用 LINQ to SQL,但在这个长时间执行的查询中遇到了障碍,因此我正在检查 LINQ 查询正在使用的 SQL(下面的查询 B)。

查询 A 运行良好:

SELECT TOP (20) 
[t0].[subject_id] AS [Subject_id],
[t0].[session_id] AS [Session_id], 
[t0].[name] AS [Name]

FROM [Subjects] AS [t0]
WHERE (NOT (EXISTS(
    SELECT NULL AS [EMPTY]
    FROM (
        SELECT TOP (100) [t1].[subject_id]
        FROM [Subjects] AS [t1]
        WHERE [t1].[session_id] = 1
        ORDER BY [t1].[name]
        ) AS [t2]
    WHERE [t0].[subject_id] = [t2].[subject_id]
    ))) AND ([t0].[session_id] = 1)

查询 B 需要 40 秒:

SELECT TOP (20) 
[t0].[subject_id] AS [Subject_id],
[t0].[session_id] AS [Session_id], 
[t0].[name] AS [Name]

FROM [Subjects] AS [t0]
WHERE (NOT (EXISTS(
    SELECT NULL AS [EMPTY]
    FROM (
        SELECT TOP (100) [t1].[subject_id]
        FROM [Subjects] AS [t1]
        WHERE [t1].[session_id] = 1
        ORDER BY [t1].[name]
        ) AS [t2]
    WHERE [t0].[subject_id] = [t2].[subject_id]
    ))) AND ([t0].[session_id] = 1)
ORDER BY [t0].[name]

当我将 ORDER BY [t0].[name] 添加到外部查询时,它会减慢查询速度。

如何改进第二个查询?


这是我的 LINQ 东西 Nick

int sessionId = 1;
int start = 100;
int count = 20;

//  Query subjects with the shoot's session id
var subjects = cldb.Subjects.Where<Subject>(s => s.Session_id == sessionId);

//  Filter as per params
var orderedSubjects = subjects
        .OrderBy<Subject, string>(
                    s => s.Col_zero 
                    );                

var filteredSubjects = orderedSubjects
        .Skip<Subject>(start)
        .Take<Subject>(count);

最佳答案

[主题].[名称] 缺少索引?

关于.net - LINQ-to-SQL 中的 "Order By"导致性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2261500/

相关文章:

sql - 如何聚合表达式的结果?

sql - 我应该在 T-SQL 字符串中转义哪些特殊字符?

c# - 气球未显示 NotifyIcon.ShowBalloonTip

sql - 按数字顺序排列字符串 alpha A1-1-1、A1-2-1、A1-10-1、A1-2-2、A1-2-3 等

c# - 使用 Azure Active Directory 进行 AD 目录编程

c# - 获取不以linq中的字母字符开头的记录

c# - 基于本地文件的 SQL Server

asp.net-mvc - LINQ to SQL 表依赖关系

c# - 在 C# 中等待异步任务时会发生什么?

.net - 为什么.net 4.5 中的多核 JIT 不是 "on by default"?