IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modélisation Discussion :

Idée pour accélerer une comparaison de base ?


Sujet :

Modélisation

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 370
    Points : 23 844
    Points
    23 844
    Par défaut Idée pour accélerer une comparaison de base ?
    Bonjour à tous et merci de votre temps et de votre aide.

    Je fais actuellement de l'optimisation de traitement sur des bases Access. En gros ma base actuelle est une chaîne de requêtes utilisant des tables intermédaires et fournissant en bout de ligne un rapport de gestion. L'optimisation consite à diminuer le temps de traitement et à automatiser les tâches manuelles.

    Mon problème vient de la comparaison de mes résultats. L'objectif est que la base d'origine et la base optimisée fournissent les même résultat dans les même tables.

    Pour compliquer la tâche je n'ai pas de clef primaire clairement identifiée :-(.

    Actuellement voilà comment je procède :

    1. Calcul de la base originale
    2. Calcul de la base optimisée
    3. Création de tables temporaires ajoutant une clef primaire par concaténation des champs de la table et hachage via un l'algorithme MD5. Il est impossible de faire des jointures sur chaque champ de la table car j'en ai trop. Et on ne peut pas faire de jointure sur un champ mémo, même si Access accèpte cela les résultats sont faux.
    4. Comparaison des clefs hachées pour déteminer si un enregistrement existe dans la table originale et pas dans la table optimisée et vice versa.


    Cela fonctionne mais est très lent et mal pratique car si j'identifie bien les absents et les présents repérer les différences n'a rien d'évident.

    J'aurai aimé avoir vos idées pour un processus plus rapide et qui idéalement signalerai les différences au sein d'un enregistrement.

    Noter qu'il y a des cas où je traite dans mon optimisation moins de données que dans l'original (ex : seulement les 2 dernières années au lieu de l'historique depuis l'avénement de l'univers) donc il peut y avoir des enregistrement en moins dans l'optimisée.

    A+

  2. #2
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut Précisions.
    Bonjour René,

    Si j'ai bien compris, en final, tu dois comparer 2 tables, c'est bien cela ?

    Si "non", je n'ai rien compris... ...

    Si "oui", appelons les tables T1 et T2, et tu sembles vouloir obtenir :
    1. la liste des enregistrements de T1 absents dans T2 ;
    2. la liste des enregistrements de T2 absents dans T1 ;
    3. la liste des enregistrements de T1 différents de ceux de T2.

    Citation Envoyé par Marot_r
    .../... j'identifie bien les absents et les présents .../...
    ==> donc, 2 parties :
    • génération de clés primaires dans T1 et dans T2 => le temps de réponse est-il acceptable ?
    • points 1 et 2 ==> le temps de réponse est-il acceptable ?


    Enfin, pour le point 3, lors de la confection de la clé primaire, tu pourrais concaténer (en VBA) tous les champs non-clé primaire dans un seul et même champ (ou deux) de façon à obtenir :
    • T1(T1Id, T1Champ1, T1Champ2, ... , T1ChampN, T1Champ1aN) ;
    • T2(T2Id, T2Champ1, T2Champ2, ... , T2ChampN, T2Champ1aN).

    et extraire les T1Champ1aN<>T2Champ1aN de T1 joint à T2 (sans flèche) via T1Id=T2Id.

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 370
    Points : 23 844
    Points
    23 844
    Par défaut
    Merci Richard.

    Oui tu as parfaitement compris le besoin, à un détail près, je peux avoir entre 10 et 60 tables à comparer :-(.

    Une large part du temps de traitement est la création de la clef primaire via l'algo MD5. La concaténation simple ne marche pas car les champs (environ entre 10 et 60 champs par table) une fois concaténés dépassent 255 carcatères et on ne peut pas utiliser de champ mémo pour les jointures. Grâce au hachage MD5 je peux ne réserver que 5 champs aux clefs primaires.

    Le gros problème est l'abscence de clef primaire. Donc pour trouver la différence entre deux enregistrement 'proches' il faudrait comparer caractère à caractère mais cela suppose d'identifier les enregistrements, ce que je fais actuellement à l'oeil en regardant mes listes de "manquant" et "en trop".

    A+

  4. #4
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Hum...
    Citation Envoyé par Marot_r
    Une large part du temps de traitement est la création de la clef primaire via l'algo MD5.
    Citation Envoyé par Marot_r
    Le gros problème est l'abscence de clef primaire.
    ==> si tu estimes que la problématique de la clé primaire n'est pas résolue, alors quand tu dis
    Citation Envoyé par Marot_r
    .../... j'identifie bien les absents et les présents .../...
    ==> l'identification des absents/présents n'est donc pas sûre à 100%, non ?

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 370
    Points : 23 844
    Points
    23 844
    Par défaut
    l'identification des absents/présents n'est donc pas sûre à 100%, non ?
    Elle est imparfaite au sens de ma logique de traitement humaine.

    Je m'explique imaginons que j'ai les enregistrements suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Original : A B C D E F
    Optimisé : A B X D E F
    Si on concatène tous les champs, les deux enregistrements sont différents donc l'un va apparaître comme "manquant" et l'autre comme "en trop". En réalité il s'agit du même enregistrement avec seulement 1 champ de différence.

    J'ai envisagé l'utilisation d'un programme de comparaison de fichiers textes (en exportant mes données au format texte, triées croissant sur la concaténation des champs) ... mais je ne suis pas certain d'y gagner et je n'ai pas beaucoup de temps alloué pour expérimenter.

    A+

  6. #6
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Citation Envoyé par Marot_r
    Si on concatène tous les champs, les deux enregistrements sont différents donc l'un va apparaître comme "manquant" et l'autre comme "en trop"
    ==> oui.

    Citation Envoyé par Marot_r
    En réalité il s'agit du même enregistrement avec seulement 1 champ de différence.
    ==> désolé, René, je suis sec... ... je ne vois pas trop comment faire ressortir, automatiquement, la notion "ce serait le même enregistrement si...".

    Je te souhaite une bonne fête ce soir et à bientôt... en 2013, donc.

  7. #7
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 664
    Points : 34 369
    Points
    34 369
    Par défaut
    Salut,

    les calculs peuvent ils etre lancés séparément ou ceux de l'une ont un impact sur l'autre ?

    Tu parles de nombreuses tables, mais le nombre d'enregistrements est-il aussi conséquent (100K+ lignes ?)

    A quelle fréquence aurait lieu ce traitement ? Un batch de nuit peut-il faire le travail ? Dans quelle mesure le résultat doit-il être optimisé encore ?

  8. #8
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 424
    Points : 20 002
    Points
    20 002
    Billets dans le blog
    67
    Par défaut
    Bonjour à tous et bonne année

    As-tu essayé la solution en VBA :

    Tu parcours la table T1 en utilisant 1 recordset et pour chaque enrg., tu vérifies s'il est présent dans T2 (en testant à chaque fois champ par champ : avec les collections Fields des 2 recordset) et si pas trouvé tu l'ajoutes dans T3.

    Tu fais la même chose entre T2 et T1...

    Comme ça tu n'as pas besoin de créer cette clé

    A voir..

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 370
    Points : 23 844
    Points
    23 844
    Par défaut
    Citation Envoyé par jpcheck
    les calculs peuvent ils etre lancés séparément ou ceux de l'une ont un impact sur l'autre ?
    Il faut faire les calculs de traitement en séquence mais la comparaison des bases pourrait être faite dans n'importe quel ordre.

    Tu parles de nombreuses tables, mais le nombre d'enregistrements est-il aussi conséquent (100K+ lignes ?)
    Le nombre d'enregistrements est très variables mais rarement au dessus de 10000 enrs. Certaine bases approchent les 2 Go et les bases de 1 Go sont assez courantes.

    A quelle fréquence aurait lieu ce traitement ? Un batch de nuit peut-il faire le travail ? Dans quelle mesure le résultat doit-il être optimisé encore ?
    Autant de fois que nécessaire pour démontrer que la version optimisée donne les mêmes résultats que la version originale. Non un batch de nuit n'est pas envisageable. L'idéal serait que le traitement de comparaion dure 1/4 gros max.

    Citation Envoyé par user
    As-tu essayé la solution en VBA :
    Non mais cela m'a donné une idée.

    Si je peux trouver un moyen simple de trier mes enregistrements sur tous les champs. Puis ensuite en comparant champ à champ je pourrai déteminer les différences entre enregistrements sembables.

    A+

  10. #10
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Hello marot_r
    je viens justement de poser une question sur la rapidité comparée de l'exécution d'une requête, d'un SQL et du même traitement par recordset VBA! (tu peux installer sans risque le test.mdb)
    J'en conclue que de très nombreuses requêtes sur 1 enregistrement à chaque fois sont très lentes!
    à l'opposé un petit nombre de traitements recordset sur un grand nombre d'enregistrements n'est pas optimum.
    La limite de choix entre les deux méthodes dépends de ta machine. (j'ai trouvé une limite à 200 lignes ou à 2000)

    Je dois dire d'abord, que je compare des contenus de tables identiques avec des noms de champs identiques et des clefs
    Mais cette méthode fonctionne aussi si les noms des tables sont différents et si les clefs n'en sont pas vraiment
    Pour la comparaison des tables, j'ai déjà utilisé une table supplémentaire indiquant:
    le nom de la table gauche
    le nom du champ gauche
    le nom de la table droite
    le nom du champ droite
    le nom de la première clef
    le nom de la deuxième clef
    le nom de la troisième clef

    ensuite, je balaie cette table, et pour chaque ligne, je fais une requête de nom correspondance ou de différence de contenu.
    Avec cette requête, j'écris dans une table temporaire
    le nom de la table gauche
    le nom du champ gauche
    la valeur texte du champ gauche
    la valeur num du champ gauche
    le nom de la table droite
    le nom du champ droite
    la valeur texte du champ droite
    la valeur num du champ droite
    et avec un beau formulaire, je présente les différences et je propose différents boutons pour:
    copier l'enregistrement complet de gauche à droite
    copier l'enregistrement complet de droite à gauche
    copier la valeur d'un seul champ de gauche à droite
    copier la valeur d'un seul champ de droite à gauche
    etc

    je reste à ta disposition pour t'envoyer tout ça si besoin

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 370
    Points : 23 844
    Points
    23 844
    Par défaut
    Désolé du silence

    Ce projet vient de glisser en bas de la pile et va y rester un bon bout donc je ne vais pas y travailler avant longtemp.

    Merci de vos suggestions.

    A+

Discussions similaires

  1. Demande d'idées pour faire une comparaison
    Par cityy dans le forum Microsoft Office
    Réponses: 3
    Dernier message: 18/05/2014, 21h16
  2. [MySQL] Une idée pour incrémenter une valeur dans une bd
    Par gastoncs dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 22/07/2010, 14h52
  3. Réponses: 6
    Dernier message: 02/04/2009, 22h47
  4. probleme pour lister une table acces base
    Par bigbathie dans le forum Struts 1
    Réponses: 1
    Dernier message: 10/12/2007, 15h50
  5. probléme pour faire une copie de base de donnée
    Par nours33 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 31/12/2005, 13h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo