PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Petit Conseil
Petit Conseil
Débuté par Delahaye Fabien, 20 juin 2005 13:37 - 3 réponses
Posté le 20 juin 2005 - 13:37
Bonjour,

Je me permet de vous présenter mon problème pour avoir des idées nouvelles.

J'ai une base Access avec 7 Millions de lignes. Je ne connais pas a l'avance le nombre d'attribut de cette table.
J'ai une base Oracle qui a le meme nombre d'attribut sur laquelle j'accède via ODBC.

Le problème est simple : Je veux copier la table Access dans Oracle par programmation.
Ce que je fais pour le moment, c'est une sélection de toute les lignes dans access via une requete de type "select * from matable" et sqlexec (sur 7 Millions de lignes, temps d'éxécution 20 Minutes, ca reste raisonnable)
Je parcours ensuite le résultat de la requete avec SQLFetch et je fais des insert dans ma table Oracle. C'est la que les problèmes commencent. D'aprés mes calculs, il faudrait 13h20 pour me copier les lignes...(alors que seulement 20 pour les lires ?????) Bon, ce n'est que du calcul, alors j'imagine que se serait peut être moins. Mais mon problème, c'est que ca plante aux environs de 3 Millions de ligne (problème de mémoire de pile je suppose...)

Donc, il faut que je revois le problème autrement....
voici la structure de mon code :

NumConnexion=sqlConnecte("MabaseAccess","","","","Access")
NumConnexion2=sqlConnecte("MabaseOracle","util1","mdp1","","ODBC")
SQLChangeConnexion(NumConnexion)

req="Select * from matableAccess"
si sqlExec(req,"REQ") alors
Tantque sqlFetch("REQ")=0
Req2="insert into matableoracle values" etc..... boucle de parcours des colonnes
SqlChangeConnexion(NumConnexion2)
SQLExec(req2,"REQ2")
SQLChangeConnexion(NumConnexion)
Fin
fin
sqlFerme("req")
Fermeture des connexions avec SQLDéconnecte.

Je suis ouvert a toutes idées pour optimiser tout ca (sauf celle d'utiliser un accès natif oracle)
Merci d'avance.

Delahaye Fabien.
Posté le 20 juin 2005 - 16:17
Il manque le SqlFerme("REQ2"), je pense que le problème de mémoire vient de là.
Concernant les temps de traitement, il faudrait lancer l'analyseur de performance, par exemple sur les 20000 premier enregistrements, pour voir quelles instructions prennent le plus de temps.

Frédéric.
Posté le 20 juin 2005 - 16:42
J'avais oublié de recopier le SQLferme("req2"), mais il est dans mon code. Mais mon programme bouffe trop de mémoire (ca monte petit a petit), il faut que j'analyse ca...
Bon, j'ai réussi a réduire le temps à 8h40, mais c encore trop...lol... ce qui prend le plus de temps, c'est l'insert dans la table Oracle... je ne vois pas encore comment optimiser...

Merci de ta réponse en tout cas :)
Posté le 20 juin 2005 - 22:01
Tu n'as de OLEDB au lieux de ODBC, c'est sûrement plus performant et l'accès natif Oracle aussi.

Une autre solution est de "partitionner" ta table Acces avec un million d'enregistrement style "select top 1000000 .... puis d'éffacer ces premiers enregistrements, de supprimer tes requetes et de recommencer le tout en boucle.