|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
|
Membre extrêmement actif
![]() ![]() Mathieu Administrateur systèmes et réseaux Inscription : juillet 2005 Messages : 1 476 ![]() |
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: Code :
Code :
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 |
||||
|
00
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
Il n'y a pas de miracle. Pour paginer sur un grand nombre de lignes, il faut générer toutes les lignes pour ne retenir que les lignes de la page affichée.
Un moyen d'optimiser cela est de faire vous même votre pagination en utilisant une procédure stockée, plutôt qu'une couteuse couche d'ORM... Les ORM possédant tous les même défaut, celui de tuer les performances ! A lire : http://img1.lemondeinformatique.fr/f...s-epaisses.pdf A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#3 |
|
Membre extrêmement actif
![]() ![]() Mathieu Administrateur systèmes et réseaux Inscription : juillet 2005 Messages : 1 476 ![]() |
Pourtant j'ai jamais eu de problèmes de performance aussi énorme avec un ORM...
La lenteur de la requête me semble plus anormal qu'un problème d'ORM |
|
00
|
|
|
#4 | ||||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
les performances dans un SGBDR ne sont pas linéaires. Avec un faible volume de données, tout est exécuté en RAM. Dès que le volume des données commence à être important les traitements ne peuvent plus se faire intégralement en RAM (sauf à l'augmenter considérablement) il y a donc pagination disque (en fait c'est l'inverse, mais peu importe, l'explication est plus simple).
L'écart intrinsèque de vitesse de lecture entre la RAM (9ns) et le disque (9 ms) est de 1 million ! En réalité avec les différents bus pour acheminer les données, cela se réduit entre 1 000 et 10 000. Les ORM écrivent des requêtes désastreuses du fait du nivellement vers le bas des requêtes SQL (il faut s'adapter à tous les SGBDR, y compris MySQL) ! Avec la requête pissé, vous lisez 7 millions de pages à lire, soit 52 Go de données à lire !!!! Essayez de récrire la requête à l'aide d'une fonction table comme ceci : Code :
Code :
Si cela ne suffit pas : 1) créez un index couvrant, voire une vue indexée. 2) augmentez la RAM du serveur 3) filtrez votre requête pour diminuer le nombre de lignes A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
||||
|
00
|
|
|
#5 | ||||
|
Membre extrêmement actif
![]() ![]() Mathieu Administrateur systèmes et réseaux Inscription : juillet 2005 Messages : 1 476 ![]() |
J'ai l’impression que ca ne fonctionne pas, j'ai apporté quelques modifications (juste renommage de variables pour que tous soit en anglais) :
Code :
Code :
J'ai aussi augmenté la RAM allouée a SQL Server à 2 Go, mais il a pas l'air d'en avoir besoin (il dépasse pas les 900Mo de RAM consommé) |
||||
|
00
|
|
|
#6 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
Quelle version / Edition de SQL Server ? 2000, 2005 , 2008, 2008 R2
Edition express, standard, enterprise ? 2 Go de RAM, c'est très peu, Un SGBDR a besoin de beaucoup de RAM, car toutes les données doivent être en mémoire pour faire une requête. A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#7 |
|
Membre extrêmement actif
![]() ![]() Mathieu Administrateur systèmes et réseaux Inscription : juillet 2005 Messages : 1 476 ![]() |
2008 R2 Datacenter Edition 64bits (via MSDNA) sous Windows Server 2008 R2 Datacenter Edition (ou Windows 7 selon le poste, mais le résultat est le même sous les deux)
Je lui ai alloué 2Go de RAM, mais j'ai pas l'impression qu'il en ai besoin vu que la consommation de RAM plusieurs heures après la modification ne dépasse pas les 900Mo.. Il y a peut-être des paramètres a régler (façon buffer pool d'InnoDB ou shared buffer de PostgreSQL) ? J'ai cru comprendre que tout était géré automatiquement... D'ailleurs la moindre lecture longue bloque complètement la base de données aux autres connexions... Je pensais que SQL Serveur gérais mieux que ça la concurrence o_O |
|
00
|
|
|
#8 | ||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
Je comprend mal : vous utilisez la version DATACENTER avec 2 Go de RAM ???
Êtes vous sur un serveur virtuel ? La fonction que je vous ai donné a été testée chez moi et fonctionne parfaitement sous SQL Server 2008. Êtes vous sur que la base est en 2008 ? Vérifiez avec : Code :
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
||
|
00
|
|
|
#9 | |||
|
Membre extrêmement actif
![]() ![]() Mathieu Administrateur systèmes et réseaux Inscription : juillet 2005 Messages : 1 476 ![]() |
Citation:
compatibility_level=100 |
|||
|
00
|
|
|
#10 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
Vous avez incorporé la requête que je vous ais donné dans une fonction table. Dans ce cas il ne doit pas y avoir de clause ORDER BY !
Mais c'est de ma faute !!! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#11 |
|
Membre extrêmement actif
![]() ![]() Mathieu Administrateur systèmes et réseaux Inscription : juillet 2005 Messages : 1 476 ![]() |
J'ai retiré le ORDER BY, ca fonctionne, mais le problème de performance est toujours là
D'ailleurs pendant la requête il n'y a quasiment aucune activité disque, seulement un core chargé a 100% par SQL Server. C'est la jointure qui a l'air de demander trop de ressources.. Ajouter un SCHEMABINDING a la vue ne change rien |
|
00
|
|
|
#12 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
Donne la description de la vue et des éventuels objets imbriqués dans cette vue (autres vues, UDF...)
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#13 | ||||||||
|
Membre extrêmement actif
![]() ![]() Mathieu Administrateur systèmes et réseaux Inscription : juillet 2005 Messages : 1 476 ![]() |
La vue :
Code :
Code :
Code :
Code :
|
||||||||
|
00
|
|
|
#14 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
1) vous utilisez un type de données obsolète (ntext) depuis la version 2005 dans votre table Messages, pour la colonne DATA
Utilisez NVARCHAR(max). 2) vous utilisez du varchar donc codé en ASCII pour les données littérale de toutes les colonnes des tables, sauf pour la colonne DATA de la table des message codée en UNICODE. Pourquoi utiliser 2 fois plus d'octets ? Soyez cohérent. Donc VARCHAR(max) 3) le fait de mettre un CLOB (DATA) dans une vue est toujours pénalisant. Tous les LOBs (BLOBs, CLOBs, NCLOBs) ne sont, par nature, pas relationnels, ce qui oblige à de multiples opérations d'IO. 4) il est inutile d'inclure les colonnes de la clef primaire lorsque celle-cio est CLUSTERED dans un index NONCLUSTERED. Ces colonnes y sont par défaut comme repère de ligne de table. En conclusion, supprimez ce blob de la définition de votre vue et vous y gagnerez en performances !!!!! Les blobs ne sont pas fait pour faire des opérations relationnelles, mais juste pour l'affichage ! Remaniez le type de données et virez les colonnes inutiles de vos index PS : je pense que vous auriez besoin d'un sérieux cours sur l'optimisation de SQL Server... A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#15 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour,
De plus, tu utilises le type BIGINT pour tes clefs primaires... Comptes-tu vraiment avoir plus de 2 147 483 647 utilisateurs sur ton site ? ![]() Je pense qu'un INT fera largement l'affaire, et tes jointures seront d'autant plus rapides... |
|
|
00
|
|
|
#16 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
Attention, il est en 64 bits, donc le type BIGINT est parfaitement justifié car le INT est très légèrement moins performant en 64 bits et inversement pour OS 32 bits ....
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#17 |
|
Membre extrêmement actif
![]() ![]() Mathieu Administrateur systèmes et réseaux Inscription : juillet 2005 Messages : 1 476 ![]() |
|
|
00
|
|
|
#18 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
Faites une requête lien d'affichage dans l'IHM.
Vous n'allez tout de même pas afficher une tableau de 65465346132 message de 2 Go dans une grille ? A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#19 | |
|
Membre extrêmement actif
![]() ![]() Mathieu Administrateur systèmes et réseaux Inscription : juillet 2005 Messages : 1 476 ![]() |
Citation:
Supprimer le blob (que j'ai transformé en nvarchar) de la vue ne change rien non plus J'ai aussi supprimé les colonnes des clés redondantes. |
|
|
00
|
|
|
#20 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
Tu affiche une colonne BLOB dans une grille de 100 lignes pour des messages de deux milliards de caractères ???
D'autre part tu n'as pas répondu s'"il s'agissait d'un serveur virtuel... A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
Copyright © 2000-2012 - www.developpez.com