J'ai entrepris d'écrire une méthode dans mon application C# qui peut renvoyer un sous-ensemble ordonné de noms d'une table contenant environ 2000 noms commençant par le 100ème nom et renvoyant les 20 noms suivants. Je le fais afin que je puisse remplir un WPF DataGrid
dans mon interface utilisateur et faire une pagination personnalisée. J'ai utilisé LINQ to SQL, mais j'ai rencontré un problème avec cette longue requête d'exécution, donc j'examine le SQL que la requête LINQ utilise (requête B ci-dessous)."Trier par" dans LINQ-to-SQL Provoque des problèmes de performances
la requête A fonctionne bien:
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)
Recherche B prend 40 secondes.
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]
Quand j'ajoute le [nom] ORDER BY [t0] à la requête externe, il ralentit bas de la requête.
Comment puis-je améliorer la deuxième requête?
C'était mon truc 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);
est ORDER BY [t0]. [Col_one] destiné à lire ORDER BY [t0]. [Nom]? – spender
yes sorry mon erreur de copier-coller – Grokodile
Avez-vous essayé d'inspecter le plan de requête généré par SQL Server pour les deux requêtes? –