Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/05/2008, 19h45   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 50
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 50
Points : 10
Points : 10
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 :
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 :
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 :
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 :
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 !
zorino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 20h03   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
un bug du cache peut-être
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2008, 19h34   #3
Membre du Club
 
Inscription : janvier 2008
Messages : 63
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 63
Points : 58
Points : 58
c'est quoi where idsession=51 ?
sdanvbnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 09h02   #4
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 50
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 50
Points : 10
Points : 10
Code :
 	 c'est quoi where idsession=51 ?
un simple champ integer de la table
zorino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 10h24   #5
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
ça pourrait ressembler à ce bug

Essaye de mettre le paramètre _table_lookup_prefetch_size à 0.
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 11h27   #6
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 50
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 50
Points : 10
Points : 10
Code :
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 ?
zorino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2008, 08h59   #7
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 50
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 50
Points : 10
Points : 10
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 !
zorino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2008, 09h09   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
dans le init.ora
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2008, 11h31   #9
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 50
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 50
Points : 10
Points : 10
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#
zorino est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h29.


 
 
 
 
Partenaires

Hébergement Web