2009-08-11 11 views
1

Pour mettre en place le scénario, Disons que j'ai 100000 lignes dans le tableau et il se développe de plus en plus chaque jour. Cette file d'attente prend actuellement plus de 2 secondes pour récupérer seulement environ 40 ou 50 lignes de la table.Aidez-moi à accélérer cette requête LINQ, s'il vous plaît?

Les données de ce tableau sont regroupées par références DateTime, donc je commence le regroupement de toutes les données par DateTime car c'est la seule valeur égale aux autres lignes de la table. Chaque groupe de lignes peut être de 1 à 5 lignes MAX. Je sélectionne ensuite les lignes groupées, sépare les données et les affiche à l'utilisateur. Le problème que je peux voir est que je provoque un EXIST et un groupe par dans le SQL. Je dois sélectionner toutes les 40 lignes à la fois pour rendre la file d'attente plus rapide, mais je choisis chaque groupe dans une boucle FOR. Alors, comment puis-je faire cette file d'attente plus rapidement? C'est le Laggiest de tous et mes utilisateurs se plaignent du temps d'attente de 2 secondes. S'il vous plaît aider.

(from yy in Data_Captured_Type_Militaries 
    where yy.DateTime_Added >= DateTime.UtcNow.AddHours(-72) 
    (from xx in Data_Captured_Type_Militaries 
    where xx.DateTime_Added >= DateTime.UtcNow.AddHours(-72) 
    group xx by xx.DateTime_Added into gg 
    select gg.Key).Contains(yy.DateTime_Added) 
    select new 
    { 
     yy.Elites, 
     yy.DateTime_Added, 
     yy.Uid, 
     yy.Military_Location, 
     yy.Province_ID, 
     yy.Time_To_Return 
    }).ToList() 

Que traduisez:

SELECT [t0].[Elites], [t0].[DateTime_Added], [t0].[uid] AS [Uid],[t0].[Military_Location], [t0].[Province_ID], [t0].[Time_To_Return] 
FROM [Data_Captured_Type_Military] AS [t0] 
WHERE (EXISTS (
    SELECT NULL AS [EMPTY] 
    FROM (
     SELECT [t1].[DateTime_Added] 
     FROM [Data_Captured_Type_Military] AS [t1] 
     WHERE [t1].[DateTime_Added] >= @p0 
     GROUP BY [t1].[DateTime_Added] 
     ) AS [t2] 
    WHERE [t2].[DateTime_Added] = [t0].[DateTime_Added] 
    )) AND ([t0].[DateTime_Added] >= @p1) 
+1

Je me souviens avoir joué à ce jeu il y a plusieurs années .... :) – Jimmy

+0

Merci Jimmy, mais ça n'aide certainement pas. lol –

Répondre

2

vous expliquer en quelque sorte, mais je ne comprends toujours pas ce que cette partie de la requête fait pour vous:

where (from xx in Data_Captured_Type_Militaries 
     where xx.DateTime_Added >= DateTime.UtcNow.AddHours(-72) 
     group xx by xx.DateTime_Added into gg 
     select gg.Key).Contains(yy.DateTime_Added) 

Cette requête imbriquée saisit chaque DateTime_Added unique dans les trois derniers jours. Vous utilisez ensuite ceci pour affiner votre requête externe en vous assurant que chacun de ces DateTime_Added existe dans la requête interne.

La requête externe est déjà réduite aux trois derniers jours de DateTime_Added s, il semblerait donc que la requête interne ne lui apportera rien. Je peux me tromper, mais la requête interne est-elle même nécessaire?

Si c'est le cas, veuillez développer ou laissez-moi savoir ce que je ne comprends pas.

+1

Je suis d'accord avec cela - il existe toujours un xx qui est le même enregistrement que yy, donc le Contient est toujours vrai. – Jimmy

+0

Bon point Ryan ... Merci pour le super Eye! J'ai sorti cette partie centrale et cela fonctionne exactement de la même façon ... Merci pour le bon œil! –

2

La requête semble assez simple. Je commencerais par regarder vos index de table dans SQL Server. Êtes-vous l'indexation DateTime_Added?

Si vous ne disposez pas d'un index sur cette colonne, essayez ceci (dans SQL Server Management Studio):

CREATE INDEX IX_Data_Captured_Type_Military_DateTime_Added 
ON Data_Captured_Type_Military (DateTime_Added) 
GO 
Questions connexes