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 Requête multitable


Sujet :

Requêtes et SQL.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut Optimisation Requête multitable
    Bonjour à tous,

    Je fais appel à votre aide car je fais face à un problème assez particulier.

    Il y aurait-il un moyen en ACCESS me permettant d'optimiser cette requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    SELECT OPERA_ACCTNG_POST_KF.TTY_NO, OPERA_ACCTNG_POST_KF.TTY_NAM, OPERA_ACCTNG_POST_KF.START_PD, OPERA_PD.END_PD, OPERA_ACCTNG_POST_KF.ACCTNG_YR_END_DAY, OPERA_ACCTNG_POST_KF.SECT_POS, OPERA_ACCTNG_POST_KF.CMP_ID, OPERA_ACCTNG_POST_KF.FINAN_YR_ID, IIf([OPERA_ACCTNG_POST_KF].[FINAN_MNTH]<=3,1,IIf([OPERA_ACCTNG_POST_KF].[FINAN_MNTH]<=6,2,IIf([OPERA_ACCTNG_POST_KF].[FINAN_MNTH]<=9,3,4))) AS FINAN_QRT_ID, OPERA_ACCTNG_POST_KF.GLBL_AU_ID, OPERA_ACCTNG_POST_KF.GLBL_AU_CODE, GCODE_BUSI_CLAS_LAST.LNAM AS BUSI_CLAS_LNAM, OPERA_ACCTNG_POST_KF.ACCTNG_NO, OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE, OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_ID, OPERA_ACCTNG_POST_KF.RELEA_DAT, OPERA_ACCTNG_POST_KF.ORIGN_ID, OPERA_ACCTNG_POST_KF.ORIG_CCY_ID, OPERA_ACCTNG_POST_KF.RATE_MNTH, OPERA_ACCTNG_POST_KF.BUSI_TYP_ID, GCODE_BUSI_TYP_LAST.LNAM AS BUSI_TYP_LNAM, OPERA_ACCTNG_POST_KF.FI_POST_DAT, OPERA_ACCTNG_POST_KF.ACCTNG_YR_ID, OPERA_ACCTNG_POST_KF.ACCTNG_PD_ID, GCODE_ACCTNG_PD_LAST.REPORT_ACCTNG_PD_ID, OPERA_ACCTNG_POST_KF.BOK_ID, GCODE_BOK_LAST.CODE AS BOK_CODE, GCODE_BOK_LAST.LNAM AS BOK_LNAM, OPERA_ACCTNG_POST_KF.ORIG_AMNT, OPERA_ACCTNG_POST_KF.KYFIG_ID, OPERA_ACCTNG_POST_KF.KYFIG_CODE, GCODE_KYFIG_LAST.AGRG_LEVL AS KYFIG_AGRG_LEVL, GCODE_KYFIG_LAST.SYS_ID AS KYFIG_SYS_ID, GCODE_KYFIG_LAST.SYS_CODE AS KYFIG_SYS_CODE, GCODE_AREA_LAST.LNAM AS AREA_LNAM, OPERA_ACCTNG_POST_KF.ESTM_CODE, GCODE_FAS_TYP_LAST.CODE AS FAS_TYP_CODE, OPERA_ACCTNG_POST_KF.SAP_ACCTNG_CEDT_UIN AS SAP_CNTRCT_PARTN_UIN, OPERA_SECT.CCY_ID AS CCY_UPL_ID, GCODE_TTY_STATUS_LAST.CODE AS TTY_STATUS_CODE, OPERA_ACCTNG_POST_KF.TAD_RSPN AS TAD_ORG_POS_CODE, OPERA_ACCTNG_POST_KF.UW_RSPN AS UW_ORG_POS_CODE, OPERA_ACCTNG_POST_KF.ORG_UNIT_CODE_RSPN AS REPORT_LINE_CODE, OPERA_ACCTNG_POST_KF.TTY_DIREC_CODE, GCODE_ACCTNG_PD_LAST.ACTIV_VF, GCODE_CMP_LAST.LOCL_CCY_ID, GCODE_FE_TMPLT_LAST.LNAM AS ESTM_TMPLT_CODE
    FROM GCODE_FE_TMPLT_LAST INNER JOIN
     
    (OPERA_SECT_HD INNER JOIN (GCODE_CMP_LAST INNER JOIN
     
    (GCODE_FAS_TYP_LAST INNER JOIN (OPERA_SECT INNER JOIN ((GCODE_TTY_STATUS_LAST INNER JOIN 
     
    (GCODE_AREA_LAST INNER JOIN 
     
    (GCODE_BOK_LAST INNER JOIN (GCODE_ACCTNG_PD_LAST INNER JOIN
     
    (GCODE_BUSI_CLAS_LAST INNER JOIN (OPERA_PD INNER JOIN 
     
    (GCODE_KYFIG_LAST INNER JOIN 
     
    OPERA_ACCTNG_POST_KF ON GCODE_KYFIG_LAST.ID = OPERA_ACCTNG_POST_KF.KYFIG_ID) ON (OPERA_PD.CLNT_ID = OPERA_ACCTNG_POST_KF.CLNT_ID) AND (OPERA_PD.TTY_NO = OPERA_ACCTNG_POST_KF.TTY_NO) AND (OPERA_PD.START_PD = OPERA_ACCTNG_POST_KF.START_PD)) ON GCODE_BUSI_CLAS_LAST.ID = OPERA_ACCTNG_POST_KF.BUSI_CLAS_ID) ON GCODE_ACCTNG_PD_LAST.ID = OPERA_ACCTNG_POST_KF.ACCTNG_PD_ID) ON GCODE_BOK_LAST.ID = OPERA_ACCTNG_POST_KF.BOK_ID) ON GCODE_AREA_LAST.ID = OPERA_ACCTNG_POST_KF.AREA_ID) ON GCODE_TTY_STATUS_LAST.ID = OPERA_PD.TTY_STATUS_ID)
     
     INNER JOIN GCODE_BUSI_TYP_LAST ON OPERA_ACCTNG_POST_KF.BUSI_TYP_ID = GCODE_BUSI_TYP_LAST.ID) ON (OPERA_SECT.TTY_NO = OPERA_ACCTNG_POST_KF.TTY_NO) AND (OPERA_SECT.START_PD = OPERA_ACCTNG_POST_KF.START_PD)) ON GCODE_FAS_TYP_LAST.ID = OPERA_SECT.FAS_TYP_ID) ON GCODE_CMP_LAST.ID = OPERA_ACCTNG_POST_KF.CMP_ID) ON OPERA_SECT_HD.TTY_NO = OPERA_SECT.TTY_NO) ON GCODE_FE_TMPLT_LAST.ID = OPERA_SECT_HD.FE_TMPLT_ID
     
    WHERE (((OPERA_ACCTNG_POST_KF.CMP_ID)=cmp_code()) AND ((OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='R' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='P' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='B_R') AND ((OPERA_ACCTNG_POST_KF.KYFIG_ID)=1066) AND ((GCODE_KYFIG_LAST.SYS_ID)=2) AND ((GCODE_ACCTNG_PD_LAST.ACTIV_VF)<>#1/1/1950#)) OR (((OPERA_ACCTNG_POST_KF.CMP_ID)=cmp_code()) AND ((OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='R' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='P' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='B_R') AND ((OPERA_ACCTNG_POST_KF.BOK_ID)<>'510') AND ((GCODE_KYFIG_LAST.AGRG_LEVL)=9) AND ((GCODE_KYFIG_LAST.SYS_ID)=11) AND ((GCODE_ACCTNG_PD_LAST.ACTIV_VF)<>#1/1/1950#)) OR (((OPERA_ACCTNG_POST_KF.CMP_ID)=cmp_code()) AND ((OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='R' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='P' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='B_R') AND ((OPERA_ACCTNG_POST_KF.KYFIG_ID)=10081) AND ((GCODE_KYFIG_LAST.SYS_ID)=4) AND ((GCODE_ACCTNG_PD_LAST.ACTIV_VF)<>#1/1/1950#)) OR (((OPERA_ACCTNG_POST_KF.CMP_ID)=cmp_code()) AND ((OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='R' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='P' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='B_R') AND ((OPERA_ACCTNG_POST_KF.KYFIG_ID)=10087) AND ((GCODE_KYFIG_LAST.SYS_ID)=5) AND ((GCODE_ACCTNG_PD_LAST.ACTIV_VF)<>#1/1/1950#));
    Merci par avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Tu veux optimisé la vitesse d'exécution ou la longueur du scripte de ta requête?

    Genre
    (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE='R' Or OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE='P' Or OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='B_R') And(OPERA_ACCTNG_POST_KF.CMP_ID)=cmp_code() Or/And etc)

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 443
    Par défaut
    Bonjour.

    Si c'est pour le temps d'execution, tu peux demander son avis a Access.
    Menu : Outils de base de donnees/Analiseur de performance.
    Il a parfois de bonne idee.

    Une autre solution est de proceder par requetes successives en stockant les resultats dans des tables intermedaires.
    FAIRE bien ATTENTION de vider les tables intermediaires avant de commencer le traitement.
    Et eventuellement apres pour eviter d'exploser les 2 Go.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Si c'est pour le temps d'execution, tu peux demander son avis a Access.
    Menu : Outils de base de donnees/Analiseur de performance.
    Il a parfois de bonne idee.
    Merci, je ne connaissais pas cette fonctionnalité de Access, je le regarde tout de suite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    Une autre solution est de proceder par requetes successives en stockant les resultats dans des tables intermedaires.
    FAIRE bien ATTENTION de vider les tables intermediaires avant de commencer le traitement.
    Et eventuellement apres pour eviter d'exploser les 2 Go.
    J'ai essayé cette solution mais elle ne m'a pas apporté le résultat voulu, ou peut-être que je ne crée pas les bonnes tables intermédiaires.

    Je vais rééssayer. Pour vous donner une vue d'ensemble de ma requête (et j'ai plusieurs critères sur cette requête, elle fonctionne vraiment bien avant que je rajoute les deux autres requêtes),

    Nom : Untitled.png
Affichages : 137
Taille : 70,9 Ko

    Merci encore pour votre aide et votre disponibilité.

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Si c'est pour le temps d'execution, tu peux demander son avis a Access.
    Menu : Outils de base de donnees/Analiseur de performance.
    Il a parfois de bonne idee.

    A+
    A ma grande surprise, nous n'avons pas accès à l'Analyseur de performances sur Access au boulot.

    Le Warning me dit que soit il n'est pas installé, soit il est en mauvais état.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 443
    Par défaut
    Bonjour.

    Pour l'analyse, voir avec ton service technique, autant que je sache c'est la par defaut mais il est prudent avec Access de demander l'installation complete (il faut en faire le choix au moment de l'installation).

    Pour ton autre probleme.

    Pour les tables intermediaires, j'essairai de "decouper" les grosses "branches", celles de OPERA_PD et OPERA_SECT.
    Je mettrai leur resultat dans une table puis je joindrai ces tables.

    C'est un peu au "filling" car Access ne fourni pas vraiment d'outil pour savoir ou les performances accrochent.

    Aussi, avant le tronconnage, assure toi que tous les champs ID des diverses tables sont bien indexes.
    Tu voudras peut-etre aussi ajouter un index compose avec les champs utilises dans ta jointure de OPERA_SECT.
    Et fait un essai puis apres : decoupe.

    Sinon, je ferai une table intermediaire par "jointure" (pas une perspective engageante du tout :-( ).
    1. Donc une table pour le resultat de la 1ere jointure.
    2. Puis une table pour le resultat et la 2ieme jointure.
    3. Etc.


    Mais vraiment cela devrait etre l'ultime solution.

    Enfin tu a beaucoup de source nommee _LAST.
    Trouver le dernier energistrement (ex : tarif a date dans un historique de tarif ou tu as juste la date de changement de tarif) peut etre tres demandant pour le systeme.
    Une methode plus efficace consiste a avoir une date de debut et une date de fin et de trouver l'enregistrement qui "encadre" la date cherchee.
    C'est plus simple a ecrire (TaDate between DateDebut and DateFin) et surtout beaucoup plus rapide (une seule recherche dans la table au lieu d'une comparaison enregistrement par enregistrement).
    Il faut juste faire attention de ne pas avoir de recouvrement de periode. C'est a valider au moment de la saisie, soit par code, soit par l'utilisateur.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 443
    Par défaut
    Un dernier point.

    Les jointures sont "couuteuses" donc si tu as vraiment des gros problemes de performance, tu peux envisager une denormalisation de ta base de donnees en recopiant une partie des donnnees.

    La aussi cela doit etre vu comme un dernier recours, apres les tables temporaires, car cela complexifie la gestion et met tes donnees a risque d'incoherence si la copie n'est pas faite pour une raison ou une autre.

    Si tu t'aligne vers cela, ca doit etre super bien signale et documente pour les developpeurs futurs.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Pour les tables intermediaires, j'essairai de "decouper" les grosses "branches", celles de OPERA_PD et OPERA_SECT.
    Je mettrai leur resultat dans une table puis je joindrai ces tables.

    C'est un peu au "filling" car Access ne fourni pas vraiment d'outil pour savoir ou les performances accrochent.
    Merci beaucoup, j'essaie cela de ce pas.


    Aussi, avant le tronconnage, assure toi que tous les champs ID des diverses tables sont bien indexes.
    Tu voudras peut-etre aussi ajouter un index compose avec les champs utilises dans ta jointure de OPERA_SECT.
    Et fait un essai puis apres : decoupe.
    J'ai un peu de mal à comprendre ce paragraphe. Que voulez-vous dire par "les champs ID des tables sont bien indexés" ?
    Et aussi par ajouter un index composé ?


    Enfin tu a beaucoup de source nommee _LAST.
    En fait, toutes les tables se terminant par LAST (dernière version de la table) me permettent de trouver les informations à part entière.
    Les tables OPERA ne contiennent que des ID pour la plupart et les tables nommées LAST les informations liées à ces ID.

    Pour le champ BOK_ID par exemple, la table BOK_LAST me permet d'avoir le code, le nom du BOK etc ... cf. image ci-dessous

    Nom : Untitled.png
Affichages : 162
Taille : 7,6 Ko

    Et c'est le même cas pour toutes les tables finissant par LAST et j'en ai tellement

    Je vous remercie pour votre aide. Je teste tout de suite la solution proposée.

  9. #9
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    Bonsoir,

    Tu veux optimisé la vitesse d'exécution ou la longueur du scripte de ta requête?
    Bonjour,

    Merci pour votre réponse, je veux optimiser la vitesse d'exécution.

    Pour être plus précis, à la requête mise dans le poste précédent, je dois rajouter ces champs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    SELECT OPERA_TTY.TTY_NO, reqACTUD.ACTUD_COLLCTN_TYP_LNAM, reqPREMD.PREMD_COLLCTN_TYP_LNAM, reqLOSSD.LOSSD_COLLCTN_TYP_LNAM
    FROM ((OPERA_TTY LEFT JOIN reqACTUD ON OPERA_TTY.TTY_NO = reqACTUD.TTY_NO) LEFT JOIN reqLOSSD ON OPERA_TTY.TTY_NO = reqLOSSD.TTY_NO) LEFT JOIN reqPREMD ON OPERA_TTY.TTY_NO = reqPREMD.TTY_NO
    WHERE (((OPERA_TTY.CMP_ID)=cmp_code()) AND ((OPERA_TTY.TTY_CLAS_ID)=1));
    Et (ce n'est pas encore fini)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    SELECT OPERA_GRP_TTY_LNK.TTY_NO, EASY_BUSI_PARTNER.NAM AS CNTRCT_PARTN_NAM, OPERA_GRP_HD.TXT AS LIFE_PROJ_CLU_GRP_TXT
    FROM OPERA_GRP_HD INNER JOIN (EASY_BUSI_PARTNER INNER JOIN OPERA_GRP_TTY_LNK ON (OPERA_GRP_TTY_LNK.CLNT_ID = EASY_BUSI_PARTNER.CLNT_ID) AND (EASY_BUSI_PARTNER.UIN = OPERA_GRP_TTY_LNK.CEDT_UIN)) ON OPERA_GRP_HD.GRP_NO = OPERA_GRP_TTY_LNK.GRP_NO
    WHERE (((OPERA_GRP_TTY_LNK.TTY_NO)=3032085) AND ((OPERA_GRP_HD.GRP_TYP_ID)=17) AND ((OPERA_GRP_HD.CMP_ID)="2000"));
    J'arrive à un plutôt bon résultat mais quand il faut joindre ces 3 requêtes ensemble. Le résultat devient .

    J'ai essayé de passer par VBA en exécutant mes requêtes dans des recordset pour ensuite les mettre dans des tables mais cela n'améliore pas du tout la vitesse d'exécution.

    Merci pour votre aide.

Discussions similaires

  1. optimisation requête-regroupement info
    Par mariobedard dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/09/2005, 15h10
  2. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  3. Optimiser requête utilisant NOT IN
    Par Neilos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/08/2005, 14h24
  4. optimisation requête
    Par alex2205 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 09/02/2005, 14h15
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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