我已经开始在我的 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/