|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : janvier 2011 Messages : 44 ![]() |
Bonjour,
j'ai une table de 75 million de lignes avec une colonne CODE_STE varchar2(2) qui peut avoir cinq valeurs distinctes, donc c'est le cas idéal pour créer un index BITMAP. je créé l'index je lance ma requête : Code :
Pouriez_vous me dire pourquoi Oracle ne passe pas par mon INDEX ? parcontre quand je fais un Code :
SELECT count(*) FROM MA_TABLE WHERE CODE_STE ='07'; |
||
|
|
00
|
|
|
#2 |
|
Membre chevronné
![]() O. JolySupport Inscription : décembre 2010 Messages : 287 ![]() |
Oracle ne prends pas ton index parceque de toutes façon il devra remonter tous les blocs de la table (Oracle ne travaille pas à la ligne mais au bloc pour ses lectures) donc il n'a aucun intérêt à lire l'index.
|
|
10
|
|
|
#3 |
|
Invité de passage
![]() Inscription : janvier 2011 Messages : 44 ![]() |
Normalement on passant par l'index il remontera que les blocs où se trouve les lignes CODE_STE='07' ? c'est le but des index .
|
|
|
00
|
|
|
#4 |
|
Membre chevronné
![]() O. JolySupport Inscription : décembre 2010 Messages : 287 ![]() |
Certes mais un bloc contient généralement plusieurs lignes.
Mettons que chaque bloc contienne 20 lignes. Tu dis n'avoir que 5 valeurs pour pour CODE_STE. Si ces valeurs sont uniformament réparties dans ta table il y a environ 4 lignes par blocs qui réponde à ta demande, donc tous les blocs doivent être remontés. |
|
10
|
|
|
#5 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 925 ![]() |
Citation:
Si tu as 5 valeurs distinctes et que tu sélectionnes 20% de la table, il y a de fortes chance que le full table scan soit plus rapide. Si tu avais 75 Millions de lignes et un bitmap sur 100'000 valeurs distintes, alors là oui, ce serait le cas idéal. Le seul cas où un bitmap de cardinalité 1/15000000 peut se révéler utile, c'est lorsqu'il est employé avec d'autres bitmaps. Dans le cas du count(*), c'est très différent car il ne doit pas accèder à la table du tout. |
|
|
10
|
|
|
#6 |
|
Invité de passage
![]() Inscription : janvier 2011 Messages : 44 ![]() |
Non les valeurs de cod_ste ne sont pas uniformément réparties.
COD_STE a 5 valeurs distincts . La table contient 70 millions de lignes mais uniquement 23000 lignes correspondes à COD_STE='07' et à ma connaissance c'est dans ce cas ou il faut utiliser un index BITMAP. les lignes de COD_STE='07' c'est des lignes d'une nouvelle société quant vient de rajouter dans la base. |
|
|
00
|
|
|
#7 |
|
Membre chevronné
![]() O. JolySupport Inscription : décembre 2010 Messages : 287 ![]() |
Dans ce cas, il faut calculer des statistiques avec histogrammes sur la colonne CODE_STE, en effet sans histogramme, l'optimiseur Oracle se comporte comme si les données étaient uniformément réparties.
|
|
20
|
|
|
#8 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 925 ![]() |
dans ce cas effectivement un index scan serait moins cher.
Quel est l'output de Code :
|
||
|
10
|
|
|
#9 | ||||
|
Invité de passage
![]() Inscription : janvier 2011 Messages : 44 ![]() |
Voici les plans d’exécution.
Dans le premier cas : Code :
Code :
|
||||
|
|
00
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 925 ![]() |
et puis
Code :
SELECT /*+INDEX(MA_TABLE bmi)*/ col1,col2 FROM MA_TABLE WHERE CODE_STE='07'; où BMI est le nom de ton index |
|
00
|
|
|
#11 | ||
|
Invité de passage
![]() Inscription : janvier 2011 Messages : 44 ![]() |
Code :
|
||
|
|
00
|
|
|
#12 |
|
Membre chevronné
![]() O. JolySupport Inscription : décembre 2010 Messages : 287 ![]() |
2 1 INDEX (FULL SCAN) OF 'IXB1_EDBFI_EVT' (NON-UNIQUE) (Cost=248435 Card=72239610)
L'index inqique une cardinalité très supérieure au nombre de lignes de la table. A priori la table a été mise à jour sur cette colonne et l'index n'est plus efficace même pour une valeur discrète. Si peu de mises à jours sont effectuées sur la table, il faut reconstruire les index bitmaps après celles-ci. Si beaucoup de mises à jour ont lieu sur la table il ne faut, en théorie, pas utiliser d'index bitmap. |
|
00
|
|
|
#13 |
|
Invité de passage
![]() Inscription : janvier 2011 Messages : 44 ![]() |
quelle est la commande à lancer pour calculer des statistiques avec histogrammes sur la colonne CODE_STE
|
|
|
00
|
|
|
#14 |
|
Membre chevronné
![]() O. JolySupport Inscription : décembre 2010 Messages : 287 ![]() |
Cette commande doit le faire
Code :
exec dbms_stats.gather_table_stats(USER,'MA_TABLE',NULL,NULL,NULL,'FOR COLUMNS CODE_STE SIZE 254') |
|
10
|
|
|
#15 | ||
|
Invité de passage
![]() Inscription : janvier 2011 Messages : 44 ![]() |
Code :
|
||
|
|
00
|
|
|
#16 |
|
Membre chevronné
![]() O. JolySupport Inscription : décembre 2010 Messages : 287 ![]() |
il y a un soucis avec le dictionnaire de données
Lire la note MOS n°1149109.1 |
|
10
|
|
|
#17 | ||
|
Invité de passage
![]() Inscription : janvier 2011 Messages : 44 ![]() |
comme le DBMS_STATS n’est pas installé comment je peux executer l'equivalent du code ci-dessous ?
Code :
|
||
|
|
00
|
|
|
#18 | |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 703 ![]() |
Bonjour,
Citation:
Mais pas forçément un index bitmap. Vu comme ça, ça me paraît un cas idéal de partitionnement... 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
|
|
|
#19 |
|
Invité de passage
![]() Inscription : janvier 2011 Messages : 44 ![]() |
Mais pas forcément un index bitmap ? il ya très peu de valeur distinctes donc un bitmap est conseillé.
citation : Vu comme ça, ça me paraît un cas idéal de partitionnement... justement le DBA nous a suggéré de faire des vues matérialisées sachant que le requête des MV c'est : select * from MA_TABLE where CD_STE=A; ou A in ('01','02','03' ....'07') moi j'était pour le partitionnement de la table mais d'après le dba c'est mieux de faire des MV !!!! |
|
|
00
|
|
|
#20 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 925 ![]() |
Code :
il ya très peu de valeur distinctes donc un bitmap est conseillé. Un bitmap a de très nombreux inconvénients, et ne convient qu'aux environments style datawarehouse où ils n'y a pas deux utilisateurs qui entrent des données simultanément Autant les tables que les vues matérialisées peuvent être partitionées, change de dba |
|
10
|
Copyright © 2000-2012 - www.developpez.com