Requete trop longue!

Résolu
Bonjour,

dans un de mes codes j'effectue une requête SQL, mais celle-ci mets plus de 3 min à s'exécuter!
j'aimerais savoir si il y'a des astuces pour réduire le temps de celle-ci?

Si je la met dans le message personne n'osera la lire :S
Elle utilise des inner join, select null, structure...
Est ce que certaine de ces fonctions prennent plus de temps que les autres?

Merci d'avance!
Configuration: Processeur: E8400 CG: HD 4870 GS 1Go de Gainward CM: P5Q pro Boitier: Antec Sonata III RAM: 2x2 Go DDr2 PC 8500 de G-Skill DD: Maxtor 500Go 7200Tr/min 32Mo

10 réponses

  • Votes
  • Date
  • Date décroissante
  1. vue que je ne vois pas ta reque c'est difficile a savoir mais moi j'opterai pour une procédure stocké!!
    C'est plus rapide et ta moin de chance que ca plante...
    1. La requete la voilà, elle est pas très bien formatté désolé ^^

      select
      CODEFILS, CODEEXTERNEFILS, CODEPERE, CODE_GP, CODE_DPT, CODEEXTERNEPERE, MONTANT, LIBELLE
      from (
      select
      ROWNUM as RNUM, CODEFILS, CODEEXTERNEFILS, CODEPERE, CODE_GP, CODE_DPT, CODEEXTERNEPERE, MONTANT, LIBELLE
      from (
      SELECT NULL AS codefils, NULL AS codeexternefils,
      nmc_ue_cdnmccmr AS codepere, nmc_gp_cdnmccmr AS code_gp,
      nmc_dpt_cdnmccmr AS code_dpt, nmc_ue_cdextnmccmr AS codeexternepere,
      SUM (DECODE (orvalmnt, 'C', vlmntmvt, -vlmntmvt)) AS montant,
      nmc_ue_lbnmccmr AS libelle
      FROM (SELECT nmc_dpt.cdresdis nmc_dpt_cdresdis,
      nmc_fam.cdnmccmr nmc_fam_cdnmccmr,
      nmc_ue.cdstrnmccmr nmc_ue_cdstrnmccmr,
      nmc_ue.cdextnmccmr nmc_ue_cdextnmccmr,
      nmc_gp.cdextnmccmr nmc_gp_cdextnmccmr,
      nmc_dpt.cdextnmccmr nmc_dpt_cdextnmccmr,
      nmc_gp.cdnmccmr nmc_gp_cdnmccmr,
      nmc_dpt.cdnmccmr nmc_dpt_cdnmccmr,
      nmc_ue.lbnmccmr nmc_ue_lbnmccmr,
      nmc_ue.cdnmccmr nmc_ue_cdnmccmr
      FROM rgxtnmc nmc_mag INNER JOIN rgxthnm hnm_mag_dpt ON hnm_mag_dpt.cdnmccmrfll =
      nmc_mag.cdnmccmr
      AND ( ( hnm_mag_dpt.dtfinlienmc IS NOT NULL
      AND TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      )
      BETWEEN hnm_mag_dpt.dtdeblienmc
      AND hnm_mag_dpt.dtfinlienmc
      )
      OR ( hnm_mag_dpt.dtfinlienmc IS NULL
      AND TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      ) >=
      hnm_mag_dpt.dtdeblienmc
      )
      )
      INNER JOIN rgxtnmc nmc_dpt ON nmc_dpt.cdnmccmr =
      hnm_mag_dpt.cdnmccmr
      AND nmc_dpt.cdresdis = 8
      AND ( ( nmc_dpt.dtfinacvnmc IS NULL
      OR (nmc_dpt.dtfinacvnmc >=
      TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      )
      )
      )
      AND (nmc_dpt.dtdebacvnmc <=
      TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      )
      )
      )
      INNER JOIN rgxthnm hnm_dpt_gp ON hnm_dpt_gp.cdnmccmrfll =
      nmc_dpt.cdnmccmr
      AND ( ( hnm_dpt_gp.dtfinlienmc IS NOT NULL
      AND TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      )
      BETWEEN hnm_dpt_gp.dtdeblienmc
      AND hnm_dpt_gp.dtfinlienmc
      )
      OR ( hnm_dpt_gp.dtfinlienmc IS NULL
      AND TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      ) >=
      hnm_dpt_gp.dtdeblienmc
      )
      )
      INNER JOIN rgxtnmc nmc_gp ON nmc_gp.cdnmccmr =
      hnm_dpt_gp.cdnmccmr
      AND ( ( nmc_gp.dtfinacvnmc IS NULL
      OR (nmc_gp.dtfinacvnmc >=
      TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      )
      )
      )
      AND (nmc_gp.dtdebacvnmc <=
      TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      )
      )
      )
      INNER JOIN rgxthnm hnm_gp_ue ON hnm_gp_ue.cdnmccmrfll =
      nmc_gp.cdnmccmr
      AND ( ( hnm_gp_ue.dtfinlienmc IS NOT NULL
      AND TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      )
      BETWEEN hnm_gp_ue.dtdeblienmc
      AND hnm_gp_ue.dtfinlienmc
      )
      OR ( hnm_gp_ue.dtfinlienmc IS NULL
      AND TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      ) >=
      hnm_gp_ue.dtdeblienmc
      )
      )
      INNER JOIN rgxtnmc nmc_ue ON nmc_ue.cdnmccmr =
      hnm_gp_ue.cdnmccmr
      AND nmc_ue.cdstrnmccmr = 2
      AND ( ( nmc_ue.dtfinacvnmc IS NULL
      OR (nmc_ue.dtfinacvnmc >=
      TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      )
      )
      )
      AND (nmc_ue.dtdebacvnmc <=
      TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      )
      )
      )
      INNER JOIN rgxthnm hnm_ue_fam ON hnm_ue_fam.cdnmccmrfll =
      nmc_ue.cdnmccmr
      AND ( ( hnm_ue_fam.dtfinlienmc IS NOT NULL
      AND TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      )
      BETWEEN hnm_ue_fam.dtdeblienmc
      AND hnm_ue_fam.dtfinlienmc
      )
      OR ( hnm_ue_fam.dtfinlienmc IS NULL
      AND TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      ) >=
      hnm_ue_fam.dtdeblienmc
      )
      )
      INNER JOIN rgxtnmc nmc_fam ON nmc_fam.cdnmccmr =
      hnm_ue_fam.cdnmccmr
      AND ( ( nmc_fam.dtfinacvnmc IS NULL
      OR (nmc_fam.dtfinacvnmc >=
      TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      )
      )
      )
      AND (nmc_fam.dtdebacvnmc <=
      TO_TIMESTAMP
      ('08/01/2010',
      'dd/MM/yyyy'
      )
      )
      )
      ) STRUCTURE,
      (SELECT *
      FROM rgxtmvc mvc
      WHERE mvc.cdmagdis = 4264
      AND mvc.dtjurcpt = TO_TIMESTAMP ('08/01/2010', 'dd/MM/yyyy')
      AND mvc.cdtypmvt IN (100,102,110,111)) mvc
      --,rgxtetn etn
      WHERE STRUCTURE.nmc_fam_cdnmccmr = mvc.cdnmccmr(+)
      AND NOT EXISTS (
      SELECT *
      FROM rgxtetn etn
      WHERE ( ( etn.dtfinlieeat IS NOT NULL
      AND TO_TIMESTAMP ('08/01/2010', 'dd/MM/yyyy')
      BETWEEN etn.dtdebeatnmc
      AND etn.dtfinlieeat
      )
      OR ( etn.dtfinlieeat IS NULL
      AND TO_TIMESTAMP ('08/01/2010', 'dd/MM/yyyy') >=
      etn.dtdebeatnmc
      )
      )
      AND etn.cdeatobjrgx IN (10,12)
      AND ( etn.cdnmccmr = STRUCTURE.nmc_dpt_cdnmccmr
      OR etn.cdnmccmr = STRUCTURE.nmc_gp_cdnmccmr
      OR etn.cdnmccmr = STRUCTURE.nmc_ue_cdnmccmr
      ))
      GROUP BY nmc_ue_cdnmccmr,
      nmc_ue_cdextnmccmr,
      nmc_ue_lbnmccmr,
      nmc_dpt_cdnmccmr,
      nmc_dpt_cdextnmccmr,
      nmc_gp_cdnmccmr,
      nmc_gp_cdextnmccmr
      ORDER BY nmc_ue_cdextnmccmr ASC
      ) where ROWNUM <= 8 )
      where RNUM > 0;
      1. Modérateur
        Salut,

        c'est sur quel SGBD ?

        Je vois beaucoup de select * dans les sous-requêtes, as-tu besoin de tous les champs ?
        1. C'est sous oracle!
          Et pour les select * c'est en effet cet partie la de la requete qui prend beaucoup de temps...
          Etant donné que c'est pas moi qui l'ai faite en entier, je galère un peu a voir ce qui est utile ou pas...
          Mais je continue d'essayer d'approfondir!
          1. J'arrive pas à faire un explain avec SQL Developer, je fais ca:

            EXPLAIN PLAN FOR
            Ma requete

            Et ca me sors une erreur...
            1. Modérateur
              essaie de faire requête après requête...
          2. Visiblement le explain plante car il veut ecrire dans une table qui n'est pas assez grande ^^

            Mais sinon la partie qui prend du temps je l'ai trouvé c'est ca:

            SELECT *
            FROM rgxtmvc mvc
            WHERE mvc.cdmagdis = 4264
            AND mvc.dtjurcpt = TO_TIMESTAMP ('08/01/2010', 'dd/MM/yyyy')
            AND mvc.cdtypmvt IN (100,102,110,111)) mvc
            --,rgxtetn etn
            WHERE STRUCTURE.nmc_fam_cdnmccmr = mvc.cdnmccmr(+)
            AND NOT EXISTS (
            SELECT *
            FROM rgxtetn etn
            WHERE ( ( etn.dtfinlieeat IS NOT NULL
            AND TO_TIMESTAMP ('08/01/2010', 'dd/MM/yyyy')
            BETWEEN etn.dtdebeatnmc
            AND etn.dtfinlieeat
            )
            OR ( etn.dtfinlieeat IS NULL
            AND TO_TIMESTAMP ('08/01/2010', 'dd/MM/yyyy') >=
            etn.dtdebeatnmc
            )
            )
            AND etn.cdeatobjrgx IN (10,12)
            AND ( etn.cdnmccmr = STRUCTURE.nmc_dpt_cdnmccmr
            OR etn.cdnmccmr = STRUCTURE.nmc_gp_cdnmccmr
            OR etn.cdnmccmr = STRUCTURE.nmc_ue_cdnmccmr
            ))

            Qui permet de récupérer les champs nécessaire pour faire se calcul:

            SUM (DECODE (orvalmnt, 'C', vlmntmvt, -vlmntmvt)) AS montant

            Alors je vais essayer d'extraire cette partie de la requete et de la traiter séparement...

            J'adore les grandes requêtes SQL comme ca xD
            1. au lieu de faire plein de select tu devrai faire des INNER JOIN c'est plus rapide :)
              1. Je peux pas faire des inner join...
                enfin pas plus que ce qu'il y'a deja!

                Le probleme viens du fait que les données sont trop nombreuses et trop enfouilli ^^
                1. La creation d'un index bien choisit (ce qui n'était pas le cas avant^^) règle le problème^^

                  Merci à vous!