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 :

Même requête, résultats différents


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 65
    Points : 30
    Points
    30
    Par défaut Même requête, résultats différents
    Bonjour,

    Je deviens fou avec une requête plutôt simple, sur une bête table (sans trigger, sans contraintes) que j'ai isolée :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    SQL*Plus: Release 8.1.7.0.0 - Production on Je Mai 22 19:25:11 2008
    
    (c) Copyright 2000 Oracle Corporation.  All rights reserved.
    
    
    Connecté à :
    Oracle Database 10g Release 10.2.0.1.0 - Production
    
    SQL> select sum(dav)  dav,
      2         sum(cav)  cav,
      3         sum(dap)  dap,
      4         sum(cap)  cap,
      5         sum(sd)   sd,
      6         sum(sc)   sc
      7  from (       
      8  select refpayeur        "refpayeur",
      9         decode(sign(sum(dav)-sum(cav)),  1, sum(dav)-sum(cav), 0)   dav,
     10         decode(sign(sum(dav)-sum(cav)), -1, sum(cav)-sum(dav), 0)   cav,
     11         sum(dap)                                                    dap,
     12         sum(cap)                                                    cap,
     13         decode(sign(sum(dav)+sum(dap)-sum(cav)-sum(cap)),  1, sum(dav)+sum(dap)-sum(cav)-sum(cap), 0)   sd,
     14         decode(sign(sum(dav)+sum(dap)-sum(cav)-sum(cap)), -1, sum(cav)+sum(cap)-sum(dav)-sum(dap), 0)   sc
     15   from tmpbalance
     16  -- where sens = -1
     17   where idsession=51
     18   group by refpayeur
     19  )
     20  /
    
    dav cav dap cap sd sc
    ---------- ----------- ---------- ----------- ---------- -----------
    4585186,28  4584322,41 14773219,7  14775070,5 5082071,79  5083058,71
    
    SQL> select sum(dav)  dav,
      2         sum(cav)  cav,
      3         sum(dap)  dap,
      4         sum(cap)  cap,
      5         sum(sd)   sd,
      6         sum(sc)   sc
      7  from (       
      8  select refpayeur        "refpayeur",
      9         decode(sign(sum(dav)-sum(cav)),  1, sum(dav)-sum(cav), 0)   dav,
     10         decode(sign(sum(dav)-sum(cav)), -1, sum(cav)-sum(dav), 0)   cav,
     11         sum(dap)                                                    dap,
     12         sum(cap)                                                    cap,
     13         decode(sign(sum(dav)+sum(dap)-sum(cav)-sum(cap)),  1, sum(dav)+sum(dap)-sum(cav)-sum(cap), 0)   sd,
     14         decode(sign(sum(dav)+sum(dap)-sum(cav)-sum(cap)), -1, sum(cav)+sum(cap)-sum(dav)-sum(dap), 0)   sc
     15   from tmpbalance
     16  -- where sens = -1
     17   where idsession=51
     18   group by refpayeur
     19  )
     20  /
    
    dav cav dap cap sd sc
    ---------- ----------- ---------- ----------- ---------- -----------
    4584322,41  4584322,41   14775580    14775580 5083041,21  5083041,21
    
    SQL> select sum(dav)  dav,
      2         sum(cav)  cav,
      3         sum(dap)  dap,
      4         sum(cap)  cap,
      5         sum(sd)   sd,
      6         sum(sc)   sc
      7  from (       
      8  select refpayeur        "refpayeur",
      9         decode(sign(sum(dav)-sum(cav)),  1, sum(dav)-sum(cav), 0)   dav,
     10         decode(sign(sum(dav)-sum(cav)), -1, sum(cav)-sum(dav), 0)   cav,
     11         sum(dap)                                                    dap,
     12         sum(cap)                                                    cap,
     13         decode(sign(sum(dav)+sum(dap)-sum(cav)-sum(cap)),  1, sum(dav)+sum(dap)-sum(cav)-sum(cap), 0)   sd,
     14         decode(sign(sum(dav)+sum(dap)-sum(cav)-sum(cap)), -1, sum(cav)+sum(cap)-sum(dav)-sum(dap), 0)   sc
     15   from tmpbalance
     16  -- where sens = -1
     17   where idsession=51
     18   group by refpayeur
     19  )
     20  /
    
    dav cav dap cap sd sc
    ---------- ----------- ---------- ----------- ---------- -----------
    4584322,41  4584322,41   14775580    14775580 5083041,21  5083041,21
    la même requête donne un résultat A lors de la première exécution, et un résultat B lors de toutes les suivantes... !

    Le contexte : Oracle10, la table contient environ 90000 lignes et environ 12000 REFPAYEUR différents

    A noter, car c'est amusant (), que le phénomène se reproduit si j'ajoute quelque chose pour changer la requête, par exemple ceci :
    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
    select sum(dav) dav,
           sum(cav) cav,
           sum(dap) dap,
           sum(cap) cap,
           sum(sd)  sd,
           sum(sc)  sc
    from (       
    select refpayeur        "refpayeur",
           decode(sign(sum(dav)-sum(cav)),  1, sum(dav)-sum(cav), 0)   dav,
           decode(sign(sum(dav)-sum(cav)), -1, sum(cav)-sum(dav), 0)   cav,
           sum(dap)  dap,
           sum(cap) cap,
           decode(sign(sum(dav)+sum(dap)-sum(cav)-sum(cap)),  1, sum(dav)+sum(dap)-sum(cav)-sum(cap), 0)   sd,
           decode(sign(sum(dav)+sum(dap)-sum(cav)-sum(cap)), -1, sum(cav)+sum(cap)-sum(dav)-sum(dap), 0)   sc
     from tmpbalance
    -- where sens = -1
     where idsession=51
     group by refpayeur, 'a'
    )
    J'obtiens alors à nouveau un résultat (parfois différent des autres, parfois le même que le premier des autres requêtes...) pour la première exécution,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DEBITAVANT CREDITAVANT DEBITAPRES CREDITAPRES SOLDEDEBIT SOLDECREDIT
    ---------- ----------- ---------- ----------- ---------- -----------
    4583798,03  4585162,41 14774324,1  14774498,5 5081541,89  5083080,71
    et un autre (le bon !) lors des suivantes !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DEBITAVANT CREDITAVANT DEBITAPRES CREDITAPRES SOLDEDEBIT SOLDECREDIT
    ---------- ----------- ---------- ----------- ---------- -----------
    4584322,41  4584322,41   14775580    14775580 5083041,21  5083041,21
    Je peux reproduire ça à chaque fois que je change la requête (le 'a' par 'aaa', par exemple) !

    Quelqu'un a-t-il déja vu ça ?
    A défaut d'une meilleure solution, j'ai mis deux fois 'OPEN' dans mon prog (la honte ! ) et ça roule, mais j'aimerais assez comprendre...

    Merci pour votre aide !

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    un bug du cache peut-être

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    c'est quoi where idsession=51 ?

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 65
    Points : 30
    Points
    30
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     	 c'est quoi where idsession=51 ?
    un simple champ integer de la table

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    ça pourrait ressembler à ce bug

    Essaye de mettre le paramètre _table_lookup_prefetch_size à 0.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 65
    Points : 30
    Points
    30
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     	 ça pourrait ressembler à ce bug
     
    Essaye de mettre le paramètre _table_lookup_prefetch_size à 0.
    comment fait-on pour modifier ce paramètre ?

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 65
    Points : 30
    Points
    30
    Par défaut
    désolé d'insister mais je ne sais pas comment modifier ce paramètre...
    Les seules infos que je trouve sur le net m'incitent plutôt à ne pas y toucher, mais en tous cas ne disent pas où ça se passe...

    Merci pour votre aide !

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    dans le init.ora

  9. #9
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 65
    Points : 30
    Points
    30
    Par défaut
    pour info, il s'agit du bug (gravissime) Oracle 4604970.

    Il se produit en cas de requête :
    - avec GROUP BY
    - avec SUM()
    - qui renvoie plusieurs dizaines de milliers de lignes (évidemment, ce critère est plutôt imprécis...)

    3 solutions :
    - le patch 10.2.0.3
    - alter system set optimizer_features_enable="10.1.0"; (+ redémarrage instance)
    - ALTER SYSTEM SET "_gby_hash_aggregation_enabled" = False scope=spfile; (+ redémarrage instance)

    Tous les détails ici : http://oracle.ittoolbox.com/groups/t...2?cv=expanded#

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/03/2014, 17h18
  2. Réponses: 1
    Dernier message: 21/08/2013, 22h14
  3. [WD14] Mêmes requêtes dans différents projets
    Par samus535 dans le forum WinDev
    Réponses: 13
    Dernier message: 24/02/2010, 15h09
  4. EXPLAIN même requête, résulta différent
    Par eratox dans le forum Requêtes
    Réponses: 14
    Dernier message: 07/01/2010, 22h17
  5. Réponses: 4
    Dernier message: 22/05/2008, 12h58

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