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 :

requête avec +0


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club Avatar de boisdin
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 56
    Points : 39
    Points
    39
    Par défaut requête avec +0
    J'ai un requête sous oracle 10g
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select   DATFACT_EMIS,FACTUR,NUMFACT_C,LOGO,DATFACT_DEB,DATFACT_FIN,MTTTC,MTHT,INDFAD,NB_P_RECAP from T_ARC_MAITRE_FAGP
      where CRM='SGP'
      	and REFCLI='1-RX0XKR'
      	and RESTIT='O'
      	and ((DATFACT_EMIS +0) >= to_date('01/01/1996','DD/MM/YYYY') and (DATFACT_EMIS +0) <= to_date('01/12/2006','DD/MM/YYYY'))
       order by DATFACT_EMIS desc;
    j'aimerais savoir ce que fait (DATFACT_EMIS +0)

  2. #2
    Invité
    Invité(e)
    Par défaut
    il additionne zéro avec DATFACT_EMIS.

    C'est pour éviter de prendre l'index sur DATFACT_EMIS ???

  3. #3
    Nouveau membre du Club Avatar de boisdin
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 56
    Points : 39
    Points
    39
    Par défaut
    c'est effectivement pour cela, DATFACT_EMIS etant dans la clé primaire alors que les autres champs sont dans un autre index

    Je ne comprends pas pourquoi cette requête fonctionne nettement plus rapidement qu'une requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select /*+index(I_ARC_MAITRE_CLIENT_FAGP)*/  DATFACT_EMIS,FACTUR,NUMFACT_C,LOGO,DATFACT_DEB,DATFACT_FIN,MTTTC,MTHT,INDFAD,NB_P_RECAP from T_ARC_MAITRE_FAGP
      where CRM='SGP'
                and REFCLI='1-RX0XKR'
                and RESTIT='O'
                and ((DATFACT_EMIS) >= to_date('01/01/1996','DD/MM/YYYY') and (DATFACT_EMIS) <= to_date('01/12/2006','DD/MM/YYYY'))
      order by DATFACT_EMIS desc;
    alors que l'index I_ARC_MAITRE_CLIENT_FAGP est justement sur les trois champs recherchés (DATFACT_EMIS, CRM, REFCLI)

  4. #4
    Invité
    Invité(e)
    Par défaut
    les cadors de l'optimisation t'en diront sûrement plus que moi (surtout si tu en dis un peu plus sur ta table...), mais essaie cette clause avec le between :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT /*+index(I_ARC_MAITRE_CLIENT_FAGP)*/  DATFACT_EMIS,FACTUR,NUMFACT_C,LOGO,DATFACT_DEB,DATFACT_FIN,MTTTC,MTHT,INDFAD,NB_P_RECAP FROM T_ARC_MAITRE_FAGP
      WHERE CRM='SGP'
                AND REFCLI='1-RX0XKR'
                AND RESTIT='O'
                AND DATFACT_EMIS between to_date('01/01/1996','DD/MM/YYYY') and to_date('01/12/2006','DD/MM/YYYY')
      ORDER BY DATFACT_EMIS DESC;

  5. #5
    Invité
    Invité(e)
    Par défaut
    Au fait, tes stats sont-elles à jour ?

  6. #6
    Nouveau membre du Club Avatar de boisdin
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 56
    Points : 39
    Points
    39
    Par défaut
    Sur ma petite base de test la requête avec (DATFACT_EMIS +0) met 0.021s
    Celle avec between et /*+index(I_ARC_MAITRE_CLIENT_FAGP)*/ met 2.8s
    Celle avec<= et >= et /*+index(I_ARC_MAITRE_CLIENT_FAGP)*/ met 0.023s

    Par contre sur la "grosse" base de prod la différence entre (DATFACT_EMIS +0) et /*+index(I_ARC_MAITRE_CLIENT_FAGP)*/ est de l'ordre d'un dizaine de seconde en faveur du (DATFACT_EMIS +0)

    J'avoue que j'aimerais bien comprendre ces subtilités

  7. #7
    Nouveau membre du Club Avatar de boisdin
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 56
    Points : 39
    Points
    39
    Par défaut
    Je ne sais pas si les stats sont à jour...
    comment puis-je le savoir ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par boisdin Voir le message
    Je ne sais pas si les stats sont à jour...
    comment puis-je le savoir ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select last_analyzed from user_tables where table_name = 'T_ARC_MAITRE_FAGP';
    Il existe sûrement un paramètre plus global mais ça ne me revient pas là.

    Pour ma version de ta requête avec le between, j'avais gardé le hint par copier/coller mais il n'est peut-être pas nécessaire et bon, j'ai toujours entendu que c'était mieux avec le between...

    Peux-tu nous montrer un describe de ta table, une idée de la volumétrie suivant l'environnement, les clefs primaires et les indexes de T_ARC_MAITRE_FAGP, un plan d'éxécution de tes requêtes, etc...
    Je ne suis pas sûr d'être en mesure de te répondre mais les personnes compétentes sûrement avec de tels indices...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 270
    Points : 342
    Points
    342
    Par défaut
    fausse manip, désolé

  10. #10
    Nouveau membre du Club Avatar de boisdin
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 56
    Points : 39
    Points
    39
    Par défaut
    La table elle même est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DATFACT_EMIS  NOT NULL    DATE
    FACTUR             NOT NULL   VARCHAR2(3)
    NUMFACT_C      NOT NULL    VARCHAR2(20)
    CRM                                  VARCHAR2(3)
    REFCLI                               VARCHAR2(48)
    .....
    C'est une table partitionnée sur le premier champ (sur annees/mois) sur 11 ans.
    La clé primaire est DATFACT_EMIS, FACTUR, NUMFACT_C
    L'index client est DATFACT_EMIS, CRM, REFCLI

    La volumétrie en production est d'environ 15 000 000 de lignes , quelques centaines sur ma base de test.
    Je n'arrive pas à faire un explain plan, j'ai PLAN_TABLE not found

  11. #11
    Nouveau membre du Club Avatar de boisdin
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 56
    Points : 39
    Points
    39
    Par défaut
    J'ai fais les explain plans.
    Pour que ça soit lisible, je le met dans un fichier attaché parce que sinon on ne voit pas grand chose !
    Fichiers attachés Fichiers attachés

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 68
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par boisdin Voir le message
    J'ai un requête sous oracle 10g
    [...]
    j'aimerais savoir ce que fait (DATFACT_EMIS +0)
    Pour moi, le "+0" est une bidouille héritée des ancienne versions d'Oracle (<=8) de manière à "griller" un index auprès de l'optimiseur "rule". Cela permet au choix de passer par un autre index ou de faire un full scan (ce qui est parfois mieux).

    Pour les versions récente d'Oracle, il vaut mieux laisser oracle décider du bon plan (et pour cela voir des statistiques à jour).
    Quel résultat (performance) as-tu sans hint, sans "+0" mais avec stats jouées ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02
  2. Requète avec NOT EXISTS
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 23/09/2003, 15h20
  3. Requête avec l'expression Like
    Par Mvu dans le forum ASP
    Réponses: 3
    Dernier message: 02/09/2003, 09h39
  4. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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