|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
Bonjour,
Je rencontre un problème lié à la bonne utilisation des index sous Oracle 10g. Je dispose d'une table case_variable : Code :
Code :
Je souhaite récupérer une liste de données, j'utilise la requête suivante : Code :
Car si j'exécute la requête suivante, l'index est correctement utilisé : Code :
Merci d'avance. |
||||||||
|
|
00
|
|
|
#2 |
|
Membre chevronné
![]() O. JolySupport Inscription : décembre 2010 Messages : 287 ![]() |
Dans le second cas, la jointure est faite sur w.id et non sur une valeur fixe, selon le nombre distinct de w.id , l'optimiseur va estimer devoir remonter un certain nombre de blocs de case_variable et de l'index si effectivement il passe par l'index. Si ce nombre de blocs est supérieur au nombre total de blocs de la table case_variable il va préférer le full table scan.
Si tu changes l'ordre des colonnes dans l'index en mettant varaiable en premier et que la colonne variable de la table case_variable est suffisamment sélective le résultat peut être différent. Si tu ajoutes la colonne value à l'index, il ne passera plus par la table case_variable mais seulement par l'index, cependant la taille de l'index va exploser. |
|
00
|
|
|
#3 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Postez la description de la table workcase. Postez le résultat de la requête dans sqlplus avec autotrace on pour voir le plan d’exécution.
Bon, Oracle n’utilise pas l’index mais c’est quoi votre problème ? |
|
|
00
|
|
|
#4 | ||||
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
Merci pour votre aide.
Voici le script de la table workcase : Code :
Code :
Mon problème, concrètement, consiste à réduire le temps de traitement de mes requêtes. Ma requête avec jointure met quelques secondes à s'exécuter, je me disais donc qu'avec un index judicieusement placé sur la table case_variable, qui contient 2 555 954 de lignes, me permettrait de réduire sensiblement le temps d'exécution. |
||||
|
|
00
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
|
|
|
00
|
|
|
#6 | ||||
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 703 ![]() |
Bonjour,
La différence entre Code :
Code :
Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
||||
|
10
|
|
|
#7 | |||
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
Citation:
Au passage, merci pour les liens, je ne savais pas qu'on pouvait simplement créer sa propre table. du coup, voici le résultat de l'explain plan : Code :
pachot --> je comprend ce que tu me dis, mais du coup, si je ne peux pas m'appuyer sur un index pour accélérer ma requête, de quel autre moyen je dispose ? |
|||
|
|
00
|
|
|
#8 | ||||
|
Membre chevronné
![]() O. JolySupport Inscription : décembre 2010 Messages : 287 ![]() |
On a obj.tcid = w.id
La requête peut donc s'écrire Code :
Code :
|
||||
|
00
|
|
|
#9 | |||||
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
Citation:
Par contre, j'ai remarqué qu'en ne mettant que "w.id" dans le select, l'explain plan montre que l'index est utilisé : Code :
|
|||||
|
|
00
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
L'index n'est pas utilisé parce qu'il n'a pas été analysé. Recalculez les statistiques avec DBMS_STATS.
|
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
J'ai passé le script suivant :
Code :
dbms_stats.gather_schema_stats(ownname=>'W4', cascade=>TRUE) ; |
|
|
00
|
|
|
#12 |
|
Membre chevronné
![]() O. JolySupport Inscription : décembre 2010 Messages : 287 ![]() |
Y a-t-il dans case_variable des valeurs de tcid qui ne correspondent pas à des valeurs de id dans workcase ?
|
|
00
|
|
|
#13 |
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
Oui, car en fait dans l'application on a des dossiers et des tâches à effectuer pour chaque dossier (donc plusieurs tâches par dossier).
Et la table case_variable contient les variables aussi bien des dossiers que des taches. |
|
|
00
|
|
|
#14 | |||
|
Membre chevronné
![]() O. JolySupport Inscription : décembre 2010 Messages : 287 ![]() |
Dans ce cas, il va être difficile de faire plus rapide que ce plan
Citation:
|
|||
|
00
|
|
|
#15 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Est-ce que la condition est assez sélective ?
|
|
|
00
|
|
|
#16 |
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com