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 :

Requete Ado - Tables Liées


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Par défaut Requete Ado - Tables Liées
    Bonjour à tous

    Voilà mon petit probleme (je vais essayé d'être clair) :
    Je travaille avec Access 2003, j'utilise des tables Access et des Tables Liées via Odbc pointant sur une base DB2.
    Mon probleme se pose lors de la liaison avec jointures entre Acess et Db2,
    j'utilise du code Vba et la méthode Ado pour les requetes

    Par exemple, je souhaite lier 2 tables : une Access ("Table1") et l'autre Db2 ("Table2") et placer le résultat ds une table Access. Le volume pouvant être retourné est de l'ordre de 200000 enregistrements.
    Ma question est : Quelle est la meilleur méthode en Ado pour réaliser ce type de requete ?
    J'ai essayé 2 méthodes et j'aimerai votre avis :

    1- j'ai essayé l'instruction Ado :
    requete = "Select A.Champs,B.Champs2....
    From Table1 A inner join Table2 B
    on (A.champsKey1 = B.champsKey1) and (A.champsKey2 = B.champsKey2)
    Where A.Champs="xx" and B.Champs3="ZZ"

    'Connection'.BeginTrans
    'Connection'.execute 'requete',,adExecuteNoRecords
    'Connection'.CommitTrans
    Mais le temps d'execution me parait assez lent voir déplorable

    2- J'ai essayé la méthode Ado avec un recordset (schématisé)
    set rstOut = currentdb.openrecordset(TableResultat)
    rstAdo.open 'Table1',,dbforwardonly
    do while not rstado.eof
    rstado2.open "select * from table2 where champs1=" & rstado.fields(champs1).value

    rstout.addnew
    ......
    rstout.update
    rstado.movenext
    loop

    Cela fonctionne pour pour traiter 200000 enregistrements, c'est long !! (je lance 200000 fois le select rstado2 )

    Quel serait pour vous la meilleur méthode à employé pour optimizer le traitement.

    Merci

  2. #2
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Hello,

    Tout dépend ou sont les 200000 enregistrements, coté access ou coté DB2 et quelles est la table qui supporte le where (table A).

    De manière générale, si d'une manière ou d'une autre tu est amené à ramener les 200000 enregistrements et que ceux ci sont sous DB2, autant importer la table en local, à partir du moment ou c'est pour de la consultation, pour un cas de mise à jour ce n'est pas interessant. J'ai déjà traité des requetes sur des tables access dépassant les 500000 enregistrements, si les index sont bien placés, ca passe bien.

    Sinon essaye de faire 2 requetes, la 1ere filtrant les données et la deuxième, s'appuyant sur la 1ere, effectuant la jointure. Access risque de pas savoir quel plan d'execution est le plus rentable dans un environnemment hétérogène. Le fait de faire 2 requetes force "en gros" le plan d'exécution.

    Si ces pistes ne donnent rien, précise STP quels sont les volumes de chaque table (access et DB2) et quelles sont les données soumises à une sélection.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Par défaut
    Merci pour la réponse rapide.

    En fait, la Table Access comprend environs 10000 enregistrements et la table Db2 contient le détail des 10000 enr. (environ 200000 records).

    La 'Where' clause se trouve sur la Table Db2. Pour tout les enregistrements de la Table Access, je vais rechercher tout le detail dans la table Db2 en filtrant Db2 sur certains criteres.

    Le résultat sera placé dans nouvelle une table Access.

    Pour cela j'utilise donc la méthode Ado.
    Premiere Question :
    Les jointures doivent elles être sous la forme :
    - From Table_Access A Inner join Table_Db2 B On A.key1=B.Key1 and A.key2=B.Key2
    Ou plutot :
    - From Table_Access A, Table_Db2 B Where A.key1=B.Key1 and A.key2=B.key2...

    Laquelle de ses 2 formes d"ecriture de jointure vous parez la plus performante ?

    Deuxieme Question :
    DelphiManiac, Comment Appliquer en Ado le schéma des 2 requetes que tu proposes ? Car ma requete est ecrite sous la forme :
    Table_Access = A et Table_Db2 =B

    Select A.Champs,B.Champs2....
    INTO Table_Access_Resultat
    From Table_Access A inner join Table_Db2 B
    on (A.champsKey1 = B.champsKey1) and (A.champsKey2 = B.champsKey2)
    Where B.Champs="xx" and B.Champs3="ZZ"

    Merci pour vos réponses et merci DelphiManiac.

  4. #4
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    La question que je me pose concerne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         Where B.Champs="xx" and B.Champs3="ZZ"
    "xx" et "ZZ" sont ils des constantes ? si oui cela filtre donc la table DB2. Dans quelle proportion 10%, 20%, x% des 200000 enregistrements.

    Il serait aussi important de savoir si cette requete est dans un but de MAJ ou juste sélection et alimentation de la nouvelle table access.

    Concernant les jointures, il est préférable d'utiliser la syntaxe "join".

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Par défaut
    La Where Clause utilise des variables paramétres (cela concerne surtout des Date) : par exemple : Where table_db2.champs_Date > varDate ....

    La table du côté Db2 est tres grande au niveau du volume (je ne connais pas le total d'enregistrements qu'elle contient, mais c'est assez important)
    En fait je récupere environ 200000 records de la table Db2 avec le filtre !!

    C'est donc un volume de données important que je souhaite récupérer.

    Le résultat (les 200000 enregistrements) seront placés dans une table Access qui à l'origine n'exite pas (je la crée via la Clause : "INTO table_Resultat" de mon select.

    Donc pour toi, la jointure Inner Join (entre ma table Access de Base et la table Db2) serait correct au niveau performance par rapport à une jointure sans Inner.

    En tout cas, merci pour les conseils.

  6. #6
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Si c'est juste dans une but "d'Import", donc pas de traitement régulier à venir, je te conseille fortement d'importer la table brute dans une base access et de faire ensuite tes requêtes d'import.

    L'avantage d'importer dans une table access est de pouvoir optimiser l'accès à cette table (mise en place d'index par exemple).

    D'autre part tu traiteras tout en local.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Par défaut
    Ok Merci pour ton aide. Je vais essayer l'import et voir les Perf.

    Merci

Discussions similaires

  1. Requete table liée ne renvoie rien
    Par KurtSilent dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/06/2013, 09h18
  2. Requete tables liées (mais pas toujours )
    Par camyo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/02/2010, 13h14
  3. [VBA] Appeler une requete venant d'une table liée ?
    Par fabiolous dans le forum VBA Access
    Réponses: 1
    Dernier message: 18/05/2007, 20h33
  4. Réponses: 7
    Dernier message: 23/08/2006, 15h59
  5. requete sur 2 tables liées avec même nom de champs
    Par Australia dans le forum Access
    Réponses: 5
    Dernier message: 02/02/2006, 11h38

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