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

Requêtes et SQL. Discussion :

Optimisation lors de la comparaison des tables


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Points : 57
    Points
    57
    Par défaut Optimisation lors de la comparaison des tables
    Bonjour,
    J'ai une table appelée TableSource qui contient plus de 100 000 enregistrements.
    Tous les jours, je dois importer dans cette table un certain nombre d' enregistrement d'un fichier excel qui contient plus de 3 000 lignes. La sélection des enregistrements à importer se fait sur la conparaison de plusieurs champs (j'importerai seulement ceux qui n'ont jamais été). La comparaison des enregistrements se fera en vba.

    Voici ma question:
    vaut-il mieux créer une table temporaire qui contiendra les enregeristrements de la TableSource filtré sur le champ 'catégories' puisque chaque fichier à importer correspondra à une catégorie. L'avantage de ce procédé me permettra de réduire considérable la taille des enregistrements à comparer.
    Et ne sera pas plus rapide de mettre tous les champs que l'on veut comparer dans un 'array', au lieu pour chaque enregistrement de faire un 'DCount' ou tout simplement de faire un 'seek' dans un recordset??

    J'ai testé toutes les combinaisons possibles mais je ne vois pas de différences, mais je voudrais avoir vos avis parce que ma table grandit assez rapidement donc je ne sais pas ce qui va se passer quand j'aurai des millions d'enregistrements. De plus, j'ai un ordinateur assez puissant ce qui n'est pas le cas de celui à qui je dois livrer l'application.

    Merci de vos conseils.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Est-ce que ta comparaison entre ta table et ton fichier est faite sur des doublons ?

    Si non, peux-tu nous détailler le type de comparaisons que tu fais.

    Starec

  3. #3
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Points : 57
    Points
    57
    Par défaut
    Je comence par transférer le fichier dans une table temporaire avec 'DoCmd.TransferText'. Cette table contiendra 15 colonnes comme la table de destination.
    Pour chaque enregistrement à importer, je regarde dans la table de destination si il existe déjà un enregistrement dont les trois premières colonnes correspondent exactement à ceux de l'enregistrement à importer, dans ce cas j'enregistre pas l'enregistrement dans la table de destination et je passe à l'enregistrement suivant dans la table source. Il faut que les 3 colonnes soit identiques, si une d'entre elles diffèrent on enregistre.

  4. #4
    Invité
    Invité(e)
    Par défaut
    OK

    Il faut que tu indexe ces colonnes de manière à ne pas admettre de doublon, je vais essayer de te détailler la procédure

    1 - Mets ta table de destination en mode création
    2 - Dans la barre d'outil tu as un bouton avec un éclair (Index), tu cliques dessus
    3 - Tu as une boite qui s'ouvre, tu met un nom d'index, et tu sélectionnes tes trois champs.
    4 - Ensuite tu te remets sur Nom index en bas de la boite trois lignes qui apparaissent, à unique tu mets OUI
    5 - Tu fermes et tu enregistres.

    L'effet de cette manipulation est que la table n'acceptera pas un enregistrement tel que la combinaison de ces trois champs soit identique.

    Ensuite tu crées une requête qui ajoute toutes les données de ta table temporaire dans ta table de destination. Access n'ajoutera pas les enregistrements dont la combinaison des trois champs est identique.

    Voilà, fait des tests sur une copie, mais à mon avis ton temps de traitement devrait grandement accélérer.

    Starec

  5. #5
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Points : 57
    Points
    57
    Par défaut
    Heu j'ai oublié préciser que cette table est alimenté par plusieurs sorte de fichier. Les doublons sur ces trois colonnes n'est pas autorisé sur les fichiers de type A mais elles seront autorisées pour ceux du type B, ... Or en mettant un indexe elle ne seront plus possibles lorsque j'importerai les fihcier du type B.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Re

    D'où l'importance de bien expliquer sont problème.

    Je vois une solution, que je n'ai jamais testé, c'est de gérer les indexes dynamiquement.

    La lecture du tuto sur DAO de Chritophe WARIN devrait t'être utile.

    Ce que je vois, c'est de crée l'indexation dynamiquement dans le cas de ce fichier et de la supprimer dans le cas des autres.

    C'est juste une idée, je n'ai jamais testé.

    Starec

  7. #7
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Points : 57
    Points
    57
    Par défaut
    ok merci pour le tuto je vais lire ca.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Re

    Dans tout les cas, je pense que le principe d'indexation sera le plus rapide pour ton traitement.

    Starec

  9. #9
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Points : 57
    Points
    57
    Par défaut
    Re

    En fait la création dynamique d'indexe ne marche pas vraiment, à moins que je n'ai pas trop compris ce que tu voulais dire. En effet, lorsque je crée l'indexe dynamiquement ou pas sur les 3 trois champs, la création ne se fera pas puisque les doublons existent déjà à cause de l'import des fichiers du type B.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Re

    Exact, je n'ai pas pensé à cela, donc là je commence à coincer.

    Je réfléchis .

    Mais si d'autres ont des idées, qu'ils n'hésitent pas à ce méler à la conversation.

    Starec

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Points : 57
    Points
    57
    Par défaut
    a ce moment là, est-ce possible de faire deux tables ? une pour le fichier A et une pour le fichier B

    sinon, lors de l'enregistrement, il suffit de comparer le nouvel enregistrement avec l'ancien et regarder si la source de l'information est A ou B

    A ce niveau là, est-ce qu'il y a un champ avec l'info de la source?

    et ensuite, est-ce que les valeurs peuvent-elle etre les mêmes dans le fichier A et dans le B ?

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    peut il exister des doublons dans la table excel ?

  13. #13
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Points : 57
    Points
    57
    Par défaut
    Bonjour,

    il n'est pas possible de faire 2 tables, parce qu'en fait j'ai dit 2 fichiers A et B mais il y a 12 fichiers, donc il faudrait 12 tables, et pour traiter les données après ce n'est pas trop pratique.
    oui il y a un champ avec la source de l'info, mais justement pour comparer le nouvel enregistrement avec l'ancien que préconises-tu?? Créer une table temporaire avec seulement les données de type A ou B.., afin de réduire la taille de la comparaison, tous mettre dans un array,....

    Les valeurs peuvent être la même dans un fichier A et B (ou C...) et un même fichier ne peut pas contenir de doublons.
    Voilà je pense avoir répondu à toutes vos questions.

    Ou sinon j'ai essayé de mettre un index unique dans un de mes anciens programmes, et c'et vrai que ca largement plus rapide ( gain de 2 à 3 minutes ).

  14. #14
    Invité
    Invité(e)
    Par défaut
    Re

    Juste une idée, faire une requête d'insertion (INSERT) avec NOT IN et la liste de tes champs.

    Le principe serait d'insérer tes données dans ta table, seulement s'il n'y a pas de correspondance dans tes trois champs.

    Ce n'est qu'une idée, à tester.

    Starec

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Points : 57
    Points
    57
    Par défaut
    question suivante :
    dans le cas ou un enregistrement apparait dans le fichier A ET dans le fichier B, lequel prime sur l'autre ?

    Sinon, dans le cas ou c'est un fichier de type B, il n'y a qu'a le rajouter sans faire d'histoire. Sinon, dans le cas ou c'est A il ne faut l'ajouter que dans le cas ou il n'y a pas de doublons.
    ensuite, les données de type B sont elles des nouvelles données ou des données de MaJ ?

  16. #16
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Points : 57
    Points
    57
    Par défaut
    Le INSERT NOT IN me donne des résultats bizarres, ou sinon cette idée me fait penser à faire une différence entre les tables et puis de transférer le résultats.

    Si un enregistrement apparait dans les 2 tables, c'est le premier qui sera importer qui sera sauvegarder
    Les données de type B sont des nouvelles données comme toutes les enregistrements

  17. #17
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Autre idée (si ton problème n'est pas encore résolu...) n'est-il pas possible d'ajouter un champ où tu inscrit un code correspondant à la table que tu importes :
    Pour les tables où aucun doublon n'est autorisé : Toujours le même code
    Pour les tables où les doublons sont permis : Un champ numéroté

    Puis tu aggrandis à quatre le nombre des champs indexés sans doublons...

    Why not.. what else ??

Discussions similaires

  1. Lenteur lors d'insertions dans des tables
    Par TheCurse dans le forum VB.NET
    Réponses: 7
    Dernier message: 23/03/2012, 20h10
  2. Comparaison des tables sources et tables cibles
    Par maserati dans le forum Oracle
    Réponses: 5
    Dernier message: 14/02/2012, 16h43
  3. [Doctrine] Schema.yml, erreur lors de la création des tables
    Par richard_m dans le forum ORM
    Réponses: 16
    Dernier message: 23/02/2011, 17h58
  4. Réponses: 3
    Dernier message: 23/11/2010, 16h39
  5. Optimisation d'une base avec des tables liés
    Par snoopy69 dans le forum Access
    Réponses: 2
    Dernier message: 28/04/2006, 10h11

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