|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre Expert
![]() |
Bonjour à tous, pour une fois c'est moi qui ouvre une discussion...
Je suis en audit chez un client qui se plaint de la lenteur d'une procédure de calcul de besoin depuis qu'il a migré ses serveurs de ORACLE 10 vers SQL SERVER 2008 R2. Avant d'y aller j'ai pensé a un problème de curseur.... réputés moins performants sous MSSQL... Bingo... il n'y a que ca... Maintenant problème: c'est un magnifique ERP derrière tout çà... en l'occurence Dynamics AX en version 3 (old quoi :-)). En regardant le code (entièrement fait côté client bien sûr ) j'ai été choqué de voir que le protocole d'accès aux données (X++) de AX ne savait travailler.... qu'avec parcours de RecordSet... qui génère un curseur pour tous les appels!La différence de performance est vraiment flagrante (4mn pour ORACLE, + de 8 pour MSSQL!) et inacceptable pour le client... La solution serait évidemment de réécrire tous cela avec un bonne SP ensembliste qui ferait la même chose en moins d'une minute à n'en pas douter... Voilà cette discussion juste pour parler de cette différence de performance... Quelles sont vos expériences là dessus? NB: j'ai gagné plus d'une minute en désactivant les indexes sur les tables de destination avant de les réactiver mais ca reste vraiment de la petite cuisine... Je n'ai pas détecte de pression mémoire ou de contention disque (pour la base de test tempDB est sur le même (et unique) disque que les logs et les datas... Le serveur est une VM sur un ESX les disques sont des 15000 tr/min sur SAN
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 958 ![]() |
En dehors des problématiques matérielles, pensez à placer vos curseurs en :
LOCAL , FORWARD_ONLY , STATIC ou FAST_FORWARD, READ_ONLY 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 Expert
![]() |
Merci Frédéric pour ce retour, je n'ai malheureusement pas la main sur les curseurs générés puisque c'est le fournisseur d'accès aux données natif de X++ qui les génère.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
00
|
|
|
#4 | |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Citation:
Ce résultat ne me surprend donc pas outre mesure : Oracle semble mieux gérer les curseurs que SQL Server. Une différence de performances du simple au double ne me semble donc pas forcément surprenante, et explique de façon très claire pourquoi sur le forum SQL Server les personnes sont si "anti-curseur" alors que ça semble moins déranger celles du forum Oracle. |
|
|
|
00
|
|
|
#5 | |
|
Expert Confirmé
![]() dba Inscription : juillet 2007 Messages : 2 522 ![]() |
Citation:
Mais il reste que les curseurs sont contre-performant des deux bords. Je ne sais pas si Oracle s'en sort un peu mieux avec les curseurs que MS SQL Server mais Oracle s'en sort mieux indiscutablement sans curseur qu'avec...
__________________
les règles du forum - mode d'emploi du forum Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) JE NE RÉPONDS PAS aux questions techniques par message privé. Écrire en français sur un forum est une marque minimale de respect. |
|
|
|
00
|
|
|
#6 | ||
![]() ![]() ![]() David BARBARINExpert SQL Server Inscription : août 2005 Messages : 3 724 ![]() |
Citation:
Le problème avec les curseurs est que l'on force le moteur SQL à opérer d'une seule façon (ligne à ligne). Avec une requête purement ensembliste le moteur SQL peut faire lui même ses propres choix et proposer de manière heurisitique la meilleure solution. Citation:
++ |
||
|
00
|
|
|
#7 | |
|
Membre Expert
![]() |
Citation:
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Qu'on ne se méprenne pas une fois de plus sur ce que je dis : je suis tout à fait d'accord sur le fait qu'une requête (ou une série de requêtes) puisse être bien plus rapide(s) que des traitements dans un (ou plusieurs) curseurs.
Juste que dans l'univers oracle, j'ai jamais vu personne partir au bûcher ou se faire traiter d'abruti après avoir écrit une procédure utilisant un curseur, chose que j'ai vu que le forum SQL Server. Et en effet, ton expérience montre qu'Oracle semble bien mieux gérer les curseurs que SQL Server (deux fois plus rapide, c'est loin d'être négligeable), et même si un curseur reste moins performant qu'une requête, il ne se transformera pas forcément en goulot d'étranglement avec Oracle, d'où des réactions moins virulentes sur le forum Oracle. |
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() |
Pour info après quelques optimisations faites sur la partie SQL SERVER la différence est moins notable mais reste importante (4mn contre 6mn40).
En effet le client a 3 serveurs car gère lui même trois clients avec des volumétries fort différentes. Sur le plus gros le CBN prends 8 heures sous ORACLE.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
00
|
|
|
#10 | |||||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 958 ![]() |
Citation:
De ce fait Oracle ne pose donc pas de verrou sur les données manipulées en lecture, au prix cependant d'une erreur de type "snapshot too old" lors des mises à jours dans le cas ou les données vivantes ont évoluées depuis la l'origine du cliché. Notez que ce mode d'isolation n'existe pas dans la norme SQL qui ne propose que de travailler sur les données vivantes des bases de données avec les niveaux :
http://sqlpro.developpez.com/isolation-transaction/ Bien entendu vous pouvez activer ce mode dans SQL Server... Pour ce faire, vous devez d'abord autoriser ce mode au niveau de la base : Code :
Code :
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