Hello,
J'ai un site interne en ASP.NET MVC2 qui utilise Entity Framework pour se connecter a une base de données SQL Server, j'ai un controleur qui contient cette méthode:
Voici un exemple de SQL généré:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public class HomeController : Controller { int perPage = 100; [OutputCache(Duration = 60, VaryByParam = "None")] public ActionResult Index(int page = 0) { IronViperEntities db = new IronViperEntities(); var messages = (from globalView in db.GlobalViews orderby globalView.MessageId descending select globalView).Skip(page*perPage).Take(perPage); ViewData["page"] = page; ViewData["messages"] = messages; return View(); }
(Ici page 13900)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 SELECT TOP (100) [Extent1].[MessageId] AS [MessageId], [Extent1].[MessageUuid] AS [MessageUuid], [Extent1].[MessageData] AS [MessageData], [Extent1].[MessagePostDate] AS [MessagePostDate], [Extent1].[ChannelName] AS [ChannelName], [Extent1].[UserName] AS [UserName], [Extent1].[UserUuid] AS [UserUuid], [Extent1].[ChannelUuid] AS [ChannelUuid] FROM ( SELECT [Extent1].[MessageId] AS [MessageId], [Extent1].[MessageUuid] AS [MessageUuid], [Extent1].[MessageData] AS [MessageData], [Extent1].[MessagePostDate] AS [MessagePostDate], [Extent1].[ChannelName] AS [ChannelName], [Extent1].[UserName] AS [UserName], [Extent1].[UserUuid] AS [UserUuid], [Extent1].[ChannelUuid] AS [ChannelUuid], row_number() OVER (ORDER BY [Extent1].[MessageId] DESC) AS [row_number] FROM (SELECT [GlobalView].[MessageId] AS [MessageId], [GlobalView].[MessageUuid] AS [MessageUuid], [GlobalView].[MessageData] AS [MessageData], [GlobalView].[MessagePostDate] AS [MessagePostDate], [GlobalView].[ChannelName] AS [ChannelName], [GlobalView].[UserName] AS [UserName], [GlobalView].[UserUuid] AS [UserUuid], [GlobalView].[ChannelUuid] AS [ChannelUuid] FROM [dbo].[GlobalView] AS [GlobalView]) AS [Extent1] ) AS [Extent1] WHERE [Extent1].[row_number] > 139000 ORDER BY [Extent1].[MessageId] DESC
Quand je suis sur une page faible (genre par 2), tout fonctionne correctement, avec des temps de réponse correct, mais dès que je passe sur un grosse page comme ici, le temps de réponse explose (plus de 7 secondes), en consommant énormement de CPU... J'ai jamais eu ce problème avec Java et MySQL/PostgreSQL sur des volumétries identiques et impossible de trouver de solution a ce problème depuis plusieurs mois, du coup je songe sérieusement a tout migrer bien que j'aimerais éviter...
SQL Profiler ne trouve aucun problème (les indexes sont OK)
Le cout en "Logical IO" est de 7,224,307.00 et le "CPU Time" à 6,888.39ms (50% sur deux cores)
SQL Server à 1Go a lui tout seul, la base de donnée complète fait a peu prêt 750Mo, et la table ~1,400,000 lignes.
Je poste sur le forum SQL Server car je n'ai eu de réponse sur le forum Entity Framework.
Le résultat est le même sur la station de developpement (Windows 7) que sur le serveur (Windows Server 2008 R2), la version est SQL Server 2008 R2 Data Center Edition
Le query plan est disponible au format XML ici: http://pastebin.com/X09aFDfm
Des idées ?
Merci
Partager