Bonsoir,
J'ai un problème au boulot d'optimisation pour la mise à jour de données provenant de base access pour SQL.
Je suis sous VS 2005/ ASP.Net/Vb.Net
Je travail pour le moment à partir d'une table source Access vers une table destination SQL (en l'occurrence des clients) mais j'aurais au total 13 tâches comme celle-ci, pour 1 agence (il faut compte un peu plus de 10 agences) (une table cliente est assez simple car c'est il n'y a pas à comparer avec d'autres tables du côté source et du côté destination).
Donc pour 1 agence j'ai environ 18000 clients que je récupère depuis ma base local MDB (très rapide : 1,4ms) pour le mettre dans mon datatable.
Du côté SQL j'ai une table de liaison (idMDB et idSQL) et ma table de client (avec des champs un peu différents sinon ce ne serais pas marrant)
J'ai gagné un temps énorme en mettant le contenu de ma table de liaison (filtré sur l'agence) dans un dictionnaire (generics) plutôt que interroger à chaque fois SQL ou de faire un RowFilter via un dataview si je l'avais mis dans un datatable.
Donc ma mécanique est la suivante :
- Je charge mon MDB (rapide)
- Je charge mon SQL Liaison dans mon dico (rapide)
- Je parcours mon MDB et interroge mon dico pour me donner l'identifiant SQL de celui-ci (rapide grâce au dico)
- Si mon identifiant SQL existe alors je prends tout mes champs MDB et je fais un contrôle des donnés/type puis je fais un update sur mon SQL (lent)
- Sinon je prends tout mes champs MDB et je fais un contrôle des donnés/type puis je fais un insert sur mon SQL et récupére l'id crée (lent) et insére dans ma table de liaison SQL les 2 identifiants (MDB/SQL) (lent)
pour mes 18000 clients j'ai mis 12mins 38 (mais je me suis rendu compte avant de partir du boulot que dans ma table liaison je n'avais pas créer mes nouveaux identifiants (à débugger lundi) donc cette action ne doit pas faire partie du temps.
il faudrait que je puisse gagner du temps encore car il faut que je fasse passer sur une journée l'ensemble des agences. Sachant aussi que les tables côté access n'auront qu'une tendance c'est d'augmenter.
Que je travail pas en direct sur les tables access des agences mais sur leur copie de sauvegarde de la veille. Je ne peut donc pas mettre de flag dans mes tables access que je modifierais pour savoir quel table a été mis à jour (quoique une idée me vient en tête).
Si vous avez des idées à me soumettre car là je sèche, j'ai repris le projet de quelqu'un (j'ai gagné énormément, la méthode du développeur précédent donne pour ce traitement sur ces même tables clients à mettre à jour un temps de 48 mins)
Merci pour vos suggestions.
Vincent.
Partager