|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||||
|
Futur Membre du Club
![]() Inscription : octobre 2003 Messages : 54 ![]() |
Bonjour.
Je travaille sur une base 10.2.0.5.0 sur Win2003 SP2. Voici mon problème : La requête Code :
Si je rajoute la clause ORDER BY j'obtiens un temps de réponse à pleurer TABLE2 compte près de 3 millions de lignes (9 champs num(10), 1 champ date) TABLE3 compte près de 32 million de lignes (4 champs num (10), 1 champ date) J'ai exécuté un explain plan des 2 requêtes dont voici le résultat. Code :
Code :
|
||||||
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
Votre première requête réécrite comme :
Code :
Le fait d'ajouter le tri sur une colonne indexée de la table TABLE3: CLE_TRI ouvre une autre possibilité: accéder d'abord aux enregistrements de la table TABLE3 via l'index TABLE4TABLE3 (!?) et éviter ainsi l'étape de tri imposé par la présence de la clause SQL ORDER BY, trouver via la CLE2 l'enregistrement de la table TABLE2 et filtrer par rapport à la condition de filtrage sur CLE1. Maintenant, la vrai la question est pourquoi cela se produit vu qu'à priori vos statistiques semble correctes (à vérifier) et que j'ai du mal à m'imaginer pourquoi la solution basée sur le premier plan avec en plus le tri effectué en dernière étape lui semble plus coûteuse que le plan 2 ? Avez vous plus de détails à nous donner ? |
||
|
|
20
|
|
|
#3 | ||
|
Futur Membre du Club
![]() Inscription : octobre 2003 Messages : 54 ![]() |
Bonjour.
Je me permet juste d'ajouter, pour ceux qui liront peut être cette discussion, un petit correctif (c'est du moins ce que j'ai dû faire) : Code :
Ceci étant dit, comment puis-je vérifier l'exactitude des mes statistiques? Quels détails puis-je vous fournir qui permettraient de pousser l'analyse? |
||
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
|
|
|
00
|
|
|
#5 |
|
Futur Membre du Club
![]() Inscription : octobre 2003 Messages : 54 ![]() |
Je regarde ces 2 points et je vous tiens au courant.
|
|
|
00
|
|
|
#6 | ||||
|
Futur Membre du Club
![]() Inscription : octobre 2003 Messages : 54 ![]() |
Bonjour.
Désolé d'avoir interrompu cette conversation aussi longtemps. J'ai pu exécuter ce que vous m'aviez demandé et voici les résultats : Code :
Code :
|
||||
|
|
00
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
Il y a quelque chose qui m’interpelle : la première requête ne ramène rien et la deuxième ramène 39 enregistrements ! Est-ce ce le cas ?
|
|
|
00
|
|
|
#8 |
|
Futur Membre du Club
![]() Inscription : octobre 2003 Messages : 54 ![]() |
C'est vrai que c'est surprenant. Je n'avais pas vu que la première ligne du tableau renvoie A-ROWS=0.
Pourtant, la requête me restitue bien les mêmes 39 lignes que la deuxième requête. Je viens de la relancer à l'instant
|
|
|
00
|
|
|
#9 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
Pourriez-vous exécuter aussi cette commande (vous devez avoir accès à la table sys.v$parameter)
Code :
|
||
|
|
00
|
|
|
#10 | ||
|
Futur Membre du Club
![]() Inscription : octobre 2003 Messages : 54 ![]() |
Code :
|
||
|
|
00
|
|
|
#11 | |||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 287 ![]() |
Citation:
C'est très intéressant de le confirmer ou d'infirmer |
|||
|
|
10
|
|
|
#12 |
|
Futur Membre du Club
![]() Inscription : octobre 2003 Messages : 54 ![]() |
Heu.... Comment je change ce parametre?
|
|
|
00
|
|
|
#13 | ||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 287 ![]() |
Code :
|
||
|
|
00
|
|
|
#14 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
|
|
|
00
|
|
|
#15 |
|
Futur Membre du Club
![]() Inscription : octobre 2003 Messages : 54 ![]() |
j'ai un peu oublié GooGle sur ce coup-la!
![]() Ceci étant dit, avec les bons paramètres, ça va tout de suite mieux. temps d'execution sans tri 00: 00: 00.09 avec tri 00: 00: 00.12 Merci infiniment de votre aide à tous les deux.
|
|
|
00
|
|
|
#16 | |||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 287 ![]() |
Citation:
C’est un bug dans le hint first_rows qu’Oracle maintient uniquement pour raison de ''backward compatibility'' en gros pour que le passé ne soit pas dépaysé. Il ne faut plus l’utiliser dans les nouvelles versions et optez plutot si besoin est au first_rows_n. Sous ce mode d’optimisation le CBO, s’il voit qu’il peut utiliser un index pour éviter un ORDER BY, alors il le fera quelque soit le cout de l’accès à cet index. Observez bien que dans votre second ''explain plan'', il n’y a aucune opération du type ORDER BY alors que votre requête contient bien une instruction ORDER BY. Par contre, on constate bien une opération INDEX FULL SCAN très couteuse et très volumineuse 32M Code :
Une remarque : dans des plans d’exécution plus compliqués on aurait observé une opération du type sort (order by) nosort montrant qu’il y a bien eu un order by mais sans passer par un tri supplémentaire. |
|||
|
|
20
|
|
|
#17 | |
|
Futur Membre du Club
![]() Inscription : octobre 2003 Messages : 54 ![]() |
Citation:
|
|
|
|
00
|
|
|
#18 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
Citation:
Ici first rows n’est pas un hint SQL mais un mode de fonctionnement de l’optimiseur légal, initialisé via un paramètre. Il existe bien aussi un hint SQL qui porte ce nom. Il n’y a pas de bug, tout simplement il fonctionne comme ça, d’après la documentation il utilise un mix de coût et règles heuristiques pour trouver un bon plan. De plus la documentation indique clairement que parfois il se trompe Citation:
|
||
|
|
00
|
|
|
#19 |
|
Futur Membre du Club
![]() Inscription : octobre 2003 Messages : 54 ![]() |
C'est bon, j'ai trouvé la réponse à ma dernière question
Code :
ALTER system SET optimizer_mode = FIRST_ROWS_1000; |
|
|
00
|
|
|
#20 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
Ajoutez scope=both si vous avez un spfile ou modifiez aussi le fichier initXXX.ora.
Sinon au prochain démarrage de l’instance vous allez avoir une surprise. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com