[MFC] ADO est trop lent !

ADO est trop lent ! [MFC] - C++ - Programmation

Marsh Posté le 12-10-2003 à 09:56:39    

J'utilise la class CADORecordset qui est très pratique mais qui est très lente lors qu'elle doit effacer d'un coup 5000 records d'une table.
 
L'opération prend 15 secondes via mon programme tandis qu'elle est pratiquement instantanée vie Access et je me demande si c'est normal ou si j'ai fait de mauvais réglages (le tout en compilation relaese avec les optimisations).
 
En générale vous avez ce genre de problème avec vos bases de données, quelle class, système ou protocole utilisez-vous avec vos application ?
 
Merci
 

Code :
  1. if(Table.GetRecordCounts() > 0)
  2. {
  3.    Table.MoveFirst();
  4.    while(!Table.isEof())
  5.    {
  6.       Table.Delete();
  7.       Table.MoveNext();
  8.    }
  9. }


 
Pour les infos sur la class :
http://www.codeproject.com/databas [...] xx431159xx

Reply

Marsh Posté le 12-10-2003 à 09:56:39   

Reply

Marsh Posté le 12-10-2003 à 11:24:56    

bah execute une requete SQL ...

Reply

Marsh Posté le 12-10-2003 à 12:00:58    

purée je rêve :/
 
Comme dit Taz, un petit DELETE FROM MATABLE et ton problème sera résolu. D'ailleurs ta comparaison est mauvaise, tu vois bien qu'ici tu effaces tes records un à un alors qu'en Access, tu les effaces en une seule opération (Ctrl-A puis Del) pas vrai?


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 12-10-2003 à 12:22:28    

drasche a écrit :

purée je rêve :/
 
Comme dit Taz, un petit DELETE FROM MATABLE et ton problème sera résolu. D'ailleurs ta comparaison est mauvaise, tu vois bien qu'ici tu effaces tes records un à un alors qu'en Access, tu les effaces en une seule opération (Ctrl-A puis Del) pas vrai?


 
En fait c'est pas si simple.
Je ne dois pas effacer toute une table mais certains records sous certaines conditions (qqs miliers à effacer qd même).

Reply

Marsh Posté le 12-10-2003 à 12:30:21    

ben tu reprends le delete avec une clause WHERE [:spamafote]
 
Je serais bien curieux de savoir comment tu fais en Access.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 12-10-2003 à 12:49:21    

drasche a écrit :

ben tu reprends le delete avec une clause WHERE [:spamafote]
 
Je serais bien curieux de savoir comment tu fais en Access.

CTRL + clique , Suppr

Reply

Marsh Posté le 12-10-2003 à 15:46:19    

drasche a écrit :

ben tu reprends le delete avec une clause WHERE [:spamafote]
 
Je serais bien curieux de savoir comment tu fais en Access.


 
Voilà, j'ai utilisé les requetes pour tout effacer d'un coup et plus de problème de vitesse.
 
A force d'utiliser, Add, delete, Add, Delete on en oublie les bonnes mannies  :D

Reply

Marsh Posté le 12-10-2003 à 17:01:19    

SQl ca pas ete fait pour les chiens  :D

Reply

Marsh Posté le 14-10-2003 à 15:01:25    

bin théoriquement le SQL est beaucoup plus rapide de de bricoler sur les objets représentant la base (qui font des requetes SQL en interne)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 14-10-2003 à 15:03:52    

ce n'est pas que théorique, la preuve :D


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 14-10-2003 à 15:03:52   

Reply

Marsh Posté le 14-10-2003 à 15:11:12    

En plus, l'avantage d'un DELETE, c'est que si ça échoue, alors aucune ligne ne sera effacée, c'est transactionnel (unitairement).
Ca évite de se retrouver avec une base bancale suite à un problème.

Reply

Marsh Posté le 14-10-2003 à 16:25:24    

Est-il possible en SQL d'ajouteur selon le nombre que l'on veut un même records en plusieurs examplaires ?
 
Style, ajouter 250x le même records :
 
 "INSERT INTO ma_table 250x (nom,message,date) VALUES ('Ingride','Message 4','lundi')";
 
Ca serait assez cool, car le ADD est lent aussi  :cry:


Message édité par iS@mi le 14-10-2003 à 16:25:58
Reply

Marsh Posté le 14-10-2003 à 16:29:03    

Nan, spa possible.
 
A moins de faire un insert d'un select. Mais il faut que tu es 250 lignes retournées par une requête :D

Reply

Marsh Posté le 14-10-2003 à 16:34:37    

MagicBuzz a écrit :

Nan, spa possible.
 
A moins de faire un insert d'un select. Mais il faut que tu es 250 lignes retournées par une requête :D


suis prenneur.
Tu veux dire, créer un scrypt qui contient 250x la même ligne de code ?
 
Ca fait un peu gros mais si je peux gagner du temps, alors je  
 
Sinon, niveau performence, une requete INSERT est plus rapide qu'un ADD avec les SetFieldValue ?


Message édité par iS@mi le 14-10-2003 à 16:36:18
Reply

Marsh Posté le 14-10-2003 à 16:38:09    

non
 
insert into table2 (select * from table1)
 
Ca va recopier les lignes de table1 dans table2 (tu peux évidement mettre des filtres)
 
Ca te permettra de créer rapidement un grand nombre de lignes.
 
PS: par contre, il faut évidement que les champs de la table2 et les champs sélectionnés dans la sous-requête aient la même structure.


Message édité par MagicBuzz le 14-10-2003 à 16:38:20
Reply

Marsh Posté le 14-10-2003 à 16:39:27    

iS@mi a écrit :


Sinon, niveau performence, une requete INSERT est plus rapide qu'un ADD avec les SetFieldValue ?


Oui, et surtout, quelquesoit ton type de recordset, la donnée est instantanément écrite dans la base et visible par tous (sauf si tu es dans une transaction évidement), alors qu'avec un Add() selon le type de RS, les données ne seront pas transmises immédiatement au serveur.

Reply

Marsh Posté le 14-10-2003 à 16:39:41    

Sinon, j'ai essayé d'utiliser Ado.net et ca bug méchament qd je passe en /clr, d'où l'impossibilité de l'utiliser  :cry:  :cry:

Reply

Marsh Posté le 14-10-2003 à 16:40:33    

/clr ?

Reply

Marsh Posté le 14-10-2003 à 16:48:57    


 
Assembly Support dans la partie générale des préférences du projet dans Visual .net 2002.
 
The /clr compiler option enables the use of Managed Extensions for C++ and creates an output file that will require the .NET Framework common language runtime at run time. There may or may not be managed data in the application.
 
D'après mes recherches, je suis pas le seul à qui ca pose problème.

Reply

Marsh Posté le 14-10-2003 à 16:49:24    

MagicBuzz a écrit :


Oui, et surtout, quelquesoit ton type de recordset, la donnée est instantanément écrite dans la base et visible par tous (sauf si tu es dans une transaction évidement), alors qu'avec un Add() selon le type de RS, les données ne seront pas transmises immédiatement au serveur.


 
Tant que tu m'en parles, j'ai ce problème :
 
J'ai une partie dans mon programme où le client rentre les repas dans un dialogue et durant toute l'ouverture de ce même dialogue, je ne referme pas mes tables pour éviter d'ouvrir et de refermer à chaque fois.
 
Le problème est que mon même programme ouvert sur une autre machine ne voit pas les changements fait tant que la table n'est pas refermée de l'autre côté, ce qui est gênant.
 
Egalement, qd j'utilise la requete tout effacer,  après plus loin dans mon code où j'utilise le delete pour une meilleur sélection, le programme ne voit pas que ces mêmes records ont été effacés et pourtant ca plante qd il veut les effacer ce qui est relativement normal puisqu'il n'existent plus (il les comptent voient via GetRecordsCount et pointe dessous avec MoveNext) ????
 
Enfin, je suis newbie dans ce domaine.
 
 

Code :
  1. Base_de_donnees.EffacerTousLesRepasViaRequete("Table" );
  2. if(Table.GetRecordCounts() > 0) // ils sont tjs là dans le RecordCount
  3. {
  4.   Table.MoveFirst();
  5.   while(!Table.isEof())
  6.   {
  7.      if(EffacerCeRecord)
  8.         Table.Delete();  // il l'efface alors qu'il n'existe plus
  9.      Table.MoveNext(); // il pointe dessus alors qu'il n'existe plus.
  10.   }
  11. }


Message édité par iS@mi le 14-10-2003 à 16:57:39
Reply

Marsh Posté le 14-10-2003 à 21:21:47    

iS@mi a écrit :

Est-il possible en SQL d'ajouteur selon le nombre que l'on veut un même records en plusieurs examplaires ?
 
Style, ajouter 250x le même records :
 
 "INSERT INTO ma_table 250x (nom,message,date) VALUES ('Ingride','Message 4','lundi')";
 
Ca serait assez cool, car le ADD est lent aussi  :cry:


Et pour faire quoi ? Je suis pas un pro de la bdd, mais le seul truc que j'ai compris dans ce que mon prof me disait c'était : "il ne faut pas dupliquer les données pour éviter les erreurs !!!". A quoi ca peut servir d'avoir 250x le même enregistrement ???

Reply

Marsh Posté le 14-10-2003 à 21:24:56    

Regarde dans les propriétés de ton objet pour faire tourner le dataset côté serveur, et non côté client, et désactive le support transactionnel niveau ADO, et normalement ça devrait se mettre à jour.
 
Enfin... En fait tu devrais trouver l'info dans la doc de C#
 
Mais je ne maîtrise pas cette partie d'ADO. Moi je passe toujours par des recordset (et non des dataset). Perso, je préfère mille fois les reccordset, ça évite de bosser avec des données inutiles (au lieu de récupérer x fois toutes les lignes des tables, tu récupères le résultat d'un select bien formé, et tu peux mettre à jour le résultat du select... que demande le peuple)
 
PS: par contre, si tu bosses en mode connecté, c'est à dire que tu vois les modifs des autres utilisateurs, gare à la charge de la BDD et de la BP, c'est TRES consommateur. Donc très bien si tu as 20 personnes en intranet... Mais si t'as 500 personnes en VPN t'oublies carrément.

Reply

Marsh Posté le 14-10-2003 à 21:27:10    

R3g a écrit :


Et pour faire quoi ? Je suis pas un pro de la bdd, mais le seul truc que j'ai compris dans ce que mon prof me disait c'était : "il ne faut pas dupliquer les données pour éviter les erreurs !!!". A quoi ca peut servir d'avoir 250x le même enregistrement ???


ça peut servir à plein de choses : jeu de test, test de montée en charge, stress des règles d'intégritées en mode réel, etc.
 
quand t'as deux lignes dans ta base, tes tests ne servent à rien, car ne sont représentatifs de rien.
 
là notamment je pense que c'est à cause de ses tests de montée en charge... il veut tester si quand on efface 250 lignes ça prends 2 secondes ou 2 heures... pour ça faut avoir 250 lignes ;)

Reply

Marsh Posté le 14-10-2003 à 21:30:28    

ah ok ok ok...

Reply

Marsh Posté le 15-10-2003 à 08:36:53    

MagicBuzz a écrit :


....
là notamment je pense que c'est à cause de ses tests de montée en charge... il veut tester si quand on efface 250 lignes ça prends 2 secondes ou 2 heures... pour ça faut avoir 250 lignes ;)


 
C'est plus ou moins ca, je regarde combien de temps ca prend pour voir si je dois optimiser  mon code en fonction de certaines charges qui pourrait être demandées.
 
C'est un programme qui doit gérer des commandes repas de plusieurs dizaines de clients et j'ai calculé une moyenne de 27 repas commandés par client et par mois, ce qui fait au bout d'un an 300 records à charger (1 recors (6 fields) = 1 repas).
 
Comme c'est 300 records sont lourds pour le chargement et la sauvegarde, pour l'instant je ruse en ne chargeant que ce qui a besoin d'être chargés et de ce qui a besoin d'être sauvés (repas modifiés par exemple).
 
Problème, je connais pas trop bien la programmation sous Windows et encore moins access et c'est pas tjs très simple.
 
Pour montrer à quoi ca ressemble :
http://users.skynet.be/bk159638/Intro.gif


Message édité par iS@mi le 15-10-2003 à 08:37:33
Reply

Marsh Posté le 15-10-2003 à 09:04:48    

Je pense dons que l'utilisation de recordset serait la bienvenue en place de dataset.
 
En effet, j'ai bossé pour ma part sur ce site :
 
http://www.sodexhoeducation.com
 
Il permet aux écoles qui font appel à Sodexho dans le monde entier (chaque école disposant d'un sous-site paramétrable généré dynamiquement) de mettre à jour leurs menus et de vendre des recharges de tickets de cantine. La population est donc, comme tu l'imagines, suppérieure, par jour à ce que tu vendras en une année. Certes, vu qu'on ne vends que des recharges de cantine, on n'a pas à gérer l'achat de plats unitairement, mais le volume compense grandement cette simplicifation.
 
Et comme tu peux le constater, le site ne ramme pas, alors qu'il tourne sur un vulgaire serveur à 2000 ?.


Message édité par MagicBuzz le 15-10-2003 à 09:06:12
Reply

Marsh Posté le 15-10-2003 à 17:42:40    

MagicBuzz a écrit :

Je pense dons que l'utilisation de recordset serait la bienvenue en place de dataset.
 
En effet, j'ai bossé pour ma part sur ce site :
 
http://www.sodexhoeducation.com
 
Il permet aux écoles qui font appel à Sodexho dans le monde entier (chaque école disposant d'un sous-site paramétrable généré dynamiquement) de mettre à jour leurs menus et de vendre des recharges de tickets de cantine. La population est donc, comme tu l'imagines, suppérieure, par jour à ce que tu vendras en une année. Certes, vu qu'on ne vends que des recharges de cantine, on n'a pas à gérer l'achat de plats unitairement, mais le volume compense grandement cette simplicifation.
 
Et comme tu peux le constater, le site ne ramme pas, alors qu'il tourne sur un vulgaire serveur à 2000 ?.


 
Ben c'est ce que j'utilise (CADORecordset)  :??:

Reply

Marsh Posté le 15-10-2003 à 17:46:16    

Au sujet de ce que tu disais à propos des accès, en fait pour l'instant je ne travaille pas via des DSN mais via des chemins d'accès sur les bases de données (Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BDD/Clients.mdb).
 
Edit: voilà, j'ai trouvé comment faire que les modifications soient vues directement.


Message édité par iS@mi le 15-10-2003 à 18:10:23
Reply

Marsh Posté le 15-10-2003 à 19:51:36    

Ca s'appelle une connexion OLE, ou OLEDB. C'est ce qu'il y a de plus performant parmis les outils ADO.

Reply

Marsh Posté le 15-10-2003 à 19:55:58    

roh comment ne l'ai-je vu plus-tôt, ce nickname sort tout droit de Star Trek [:meganne]
 
[/HS]


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 15-10-2003 à 20:15:13    

drasche a écrit :

roh comment ne l'ai-je vu plus-tôt, ce nickname sort tout droit de Star Trek [:meganne]
 
[/HS]


 
Oui qd j'ai vu citation personnelle, je me suis dis, qu'est ce que je vais bien pouvoir mettre  [:meganne]  :D  
Mais bon, je suis plus trop fan en ce moment car StarTrek c'est mort et je déteste Enterprise  (ZzzzzZzzzZZZzzz)  :fou:  
 
Enfin, c'est pas trop le sujet mais je ferai une recherche pour voir comment qu'on utilise des BDD via OLE pour le réseau.
Franchement, je pensais pas qu'il y avait autant de truc pour simplement gérer des bases de données  :D


Message édité par iS@mi le 15-10-2003 à 20:15:56
Reply

Marsh Posté le 15-10-2003 à 20:29:15    

je parlais de ton nickname, déjà plus difficile à faire un lien si on connaît pas bien le domaine :D (la citation, clair que c'est connu :o)
 
les bases de données, on n'a jamais dit que c'était simple hein :D
Les BDD via le réseau, pas compliqué, une interface en ADO avec support ODBC derrière, ya tout ce qu'il faut, j'ai un mini exemple de récupération de données dans la FAQ VB (un jour, faudra que je montre les recordsets déconnectés :o)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 15-10-2003 à 21:38:49    

drasche a écrit :

je parlais de ton nickname, déjà plus difficile à faire un lien si on connaît pas bien le domaine :D (la citation, clair que c'est connu :o)
 
les bases de données, on n'a jamais dit que c'était simple hein :D
Les BDD via le réseau, pas compliqué, une interface en ADO avec support ODBC derrière, ya tout ce qu'il faut, j'ai un mini exemple de récupération de données dans la FAQ VB (un jour, faudra que je montre les recordsets déconnectés :o)


 
Ha bon, un lien avec quoi (nickname) ????
 

Reply

Marsh Posté le 15-10-2003 à 21:44:11    

Isami, c'est le surnom donné par Deanna Troi à Will Riker (à une époque antérieure à TNG)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 15-10-2003 à 21:51:20    

drasche a écrit :

Isami, c'est le surnom donné par Deanna Troi à Will Riker (à une époque antérieure à TNG)


 
Ha ben quel hazard, ca avait strictement rien avoir (Sami ca vient de mon non de famille samyn et le i devant c'était à l'époque de la mode de l'iMac de mettre plein de i partout)  :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed