Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 15/11/2011, 15h41   #1
Membre émérite
 
Avatar de Jidefix
 
Inscription : septembre 2006
Messages : 680
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : septembre 2006
Messages : 680
Points : 861
Points : 861
Par défaut Dans la catégorie "Pourquoi mon index n'est pas utilisé?"

Bonjour,
je sais que la question a été posée des millions de fois mais quand même là c'est un peu gros:
j'ai une table de 10 millions de lignes environ, avec une cinquantaine de colonnes.
La colonne colonne1 est un VARCHAR2(100) avec un index directement dessus.

Je fais un
Code :
1
2
3
 
SELECT * FROM matable
WHERE colonne1 = 'Ma Valeur'
l'index est bien utilisé (vérifié via explain plan), j'ai mes 27 lignes de résultat en 150 ms environ

Maintenant je tente un truc de fou:
Code :
1
2
3
4
 
SELECT * FROM matable
WHERE colonne1 = 'Ma Valeur'
ORDER BY colonne2
Et là c'est le drame: je retombe en full table scan, je récupère mes 27 lignes triées en 1 minutes.

En utilisant un hint:
Code :
1
2
3
4
 
SELECT /*+ index(matable monindex) */ * FROM matable
WHERE colonne1 = 'Ma Valeur'
ORDER BY colonne2
, je retrouve mes 150 ms


Sauf qu'inclure un hint dans mon application ne m'arrange pas vraiment.
Comment un simple order by peut-il changer le plan d'exécution à ce point? Au pire je ferai le tri dans mon appli mais c'est quand même dommage...


Détails techniques:
- Oracle 10G
- la table et l'index ont été analysés juste avant la requête
- il y a un index sur colonne2, qui ne semble pas être utilisé pour ces 3 requêtes...

Quelqu'un a une idée?
__________________
La signature que vous avez demandée n'est pas disponible pour l'instant, veuillez rappeler ultérieurement.
Jidefix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 16h40   #2
Modérateur
 
Avatar de Golgotha
 
Homme cédric
Développeur informatique
Inscription : août 2007
Messages : 732
Détails du profil
Informations personnelles :
Nom : Homme cédric
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2007
Messages : 732
Points : 1 562
Points : 1 562
Envoyer un message via Skype™ à Golgotha
Bonjour,

Pourquoi un select * ?

Sinon, je sais pas trop.... qu'est ce que ça donne ça :

Code :
1
2
3
SELECT c1,c2 
FROM (SELECT c1,c2 FROM matable WHERE c1 = 'Ma Valeur')
ORDER BY c2
__________________
modérateur webmasters - développements web & php
faq jQuery - règles du forum - faqs web
mon espace perso
Venez participez au deuxième defi Web !
Golgotha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 17h26   #3
Membre expérimenté
 
François
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 306
Points : 536
Points : 536
Par défaut Le mieux, c'est encore d'avoir l'avis du principal interesse

Ce que l'optimiseur fait, il n'y a que lui qui le sait. Mais, comme il est cool, il veut bien nous donner des gros indices:
l'event 10053, ca répondra a toute vos questions

Un petit lien pour expliquer:
http://www.centrexcc.com/A%20Look%20...0Event.ppt.pdf
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 11h26   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 313
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 313
Points : 5 819
Points : 5 819
Que est-ce que ça donne
Code :
1
2
3
4
 
SELECT /*+ gather_plan_statistics */ 
  FROM matable
 WHERE colonne1 = 'Ma Valeur'
suivi de

Code :
1
2
3
 
SELECT * 
FROM TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST'));
Comparez surtout les cardinalités estimés (E-Rows) avec les cardinalités réelles (A-Rows)
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h24.


 
 
 
 
Partenaires

Hébergement Web