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

SQL Oracle Discussion :

pb performance requete avec différence dates


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 113
    Par défaut pb performance requete avec différence dates
    Bonjour,
    J'ai un problème de performance et je ne comprends pas pourquoi mais il est vrai que je ne suis pas une experte bdd alors je fais appel à vous.
    J'ai créé une vue
    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
    create or replace view v_lignes_di as
    (select id_da_ligne as id_da_ligne, da_ligne.id_da_entete as id_da_entete, 
      da_ligne.id_organisation_logistique as id_organisation_logistique, da_ligne.id_article as id_article,
      date_du_besoin as date_besoin, date_approbation as date_approbation, delai_appro as delai_appro,
      case when date_du_besoin-date_approbation < delai_appro then 'O' else 'N' end as flg_di_anticip
    from
    da_entete, da_ligne,
    (select id_article, delai_appro, id_organisation_logistique
    from article_secondaire
    where id_article in(select distinct id_article
    from da_entete, da_ligne
    where DA_LIGNE.ID_DA_ENTETE=DA_ENTETE.ID_DA_ENTETE 
    and DA_ENTETE.ID_TYPE_DOCUMENT = 19 )) temp
    where 
    DA_LIGNE.ID_DA_ENTETE=DA_ENTETE.ID_DA_ENTETE
    and DA_ENTETE.ID_TYPE_DOCUMENT = 19
    and da_ligne.id_article = temp.id_article 
    and da_ligne.id_organisation_logistique = temp.id_organisation_logistique)
    Quand je fais un select * je mets environ 113.5sec, si je rajoute une condition sur la date d'approbation, je mets 17.719s, tout cela est OK.
    Le problème vient quand je mets une condition sur mon flag O/N
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from v_lignes_di
    where to_char(date_approbation,'MM/YYYY') = '05/2006'
    and flg_di_anticip = 'N'
    Ma requete n'en fini pas!!
    Pourquoi??? Merci d'avance pour toute idée

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    sans plan d'exécution c'est impossible de répondre

  3. #3
    Membre émérite
    Inscrit en
    Décembre 2003
    Messages
    493
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 493
    Par défaut
    pense à créer un functional index sur date_approbation voire un bitmap index sur ton flag

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    avant de créer de nouveaux indexes, je pense qu'il faut qu'on comprenne pourquoi l'ajout d'un critère pose tant de problème

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 113
    Par défaut
    Je ne sais pas si cela peut vous aider mais ci joint l'explain plan que me fourni PL/SQL Developper... Merci d'avance
    Images attachées Images attachées  

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    il n'y a pas d'index sur article_secondaire.article_id ?

    et pourquoi tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     FROM da_entete,
           da_ligne,
           (SELECT id_article, delai_appro, id_organisation_logistique
              FROM article_secondaire
             WHERE id_article IN (
                      SELECT DISTINCT id_article
                                 FROM da_entete, da_ligne
                                WHERE da_ligne.id_da_entete = da_entete.id_da_entete
                                  AND da_entete.id_type_document = 19)) temp
    et pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      FROM da_entete,
           da_ligne,
    	   article_secondaire
     WHERE article_secondaire.id_article = da_entete.id_article
    tout simplement

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Tu peux nous donner les PK, Index et Volumétries de tes tables.
    J'ai un sentiment bizarre sur la sous requete "temp"

    Sinon, le CASE, tu peux le remplacer et voir ce que ça donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE WHEN date_du_besoin - date_approbation < delai_appro THEN 'O' ELSE 'N' END AS flg_di_anticip
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECODE( SIGN(date_du_besoin - date_approbation - delai_appro), -1 , 'O', 'N') AS flg_di_anticip

Discussions similaires

  1. [Access] Comment créer une requete avec la date
    Par Daniela dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/09/2006, 11h06
  2. Problème sur une requete avec champ date
    Par islande dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2006, 19h39
  3. Requete avec des dates
    Par keibenoit dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 14/06/2006, 17h24
  4. [VB.NET] Requete avec des dates dans un DataSet
    Par leSeb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/10/2005, 14h30
  5. Requetes avec des dates
    Par PrinceMaster77 dans le forum SQL
    Réponses: 1
    Dernier message: 22/11/2004, 17h46

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