J'ai obtenu une requête LINQ très simple:LINQ Requête incroyablement lente - pourquoi?
List<table> list = (from t in ctx.table
where
t.test == someString
&& t.date >= dateStartInt
&& t.date <= dateEndInt
select t).ToList<table>();
Le tableau qui obtient interrogé a obtenu environ 30 millions de lignes, mais les colonnes test
et date
sont indexées. Lorsqu'il faut retourner environ 5000 lignes, il faut plusieurs minutes pour terminer.
J'ai également vérifié la commande SQL générée par LINQ. Si j'exécute cette commande sur SQL Server, il faut 2 secondes pour terminer.
Quel est le problème avec LINQ ici? C'est juste une requête très simple sans aucune jointure.
C'est la requête SQL Profiler montre:
exec sp_executesql N'SELECT [t0].[test]
FROM [dbo].[table] AS [t0]
WHERE ([t0].[test] IN (@p0)) AND ([t0].[date] >= @p1)
AND ([t0].[date] <= @p2)',
N'@p0 nvarchar(12),@p1 int,@p2 int',@p0=N'123test',@p1=110801,@p2=110804
EDIT:
Il est vraiment bizarre. Pendant les tests, j'ai remarqué que c'est beaucoup plus rapide maintenant. La requête LINQ prend maintenant 3 secondes pour environ 20000 lignes, ce qui est tout à fait correct.
Ce qui est encore plus déroutant: C'est le même comportement sur notre serveur de production. Il y a une heure c'était vraiment lent, maintenant c'est rapide encore. Comme je testais sur le serveur de développement, je n'ai rien changé sur le serveur de production. La seule chose que je peux penser d'être un problème est que les deux serveurs sont virtualisés et partagent le SAN avec beaucoup d'autres serveurs.
Comment puis-je savoir si c'est le problème?
SQL Server en cache des requêtes, de sorte que vous ne pourriez pas effectuer un test équitable. –
Avez-vous regardé le plan d'exécution? L'index est-il fragmenté? – Phill
Regardez avec SQL Server Profiler pour savoir quelle requête est * vraiment * exécutée. – Heinzi