Les Index Pour Les Entrepôts de Données: Comparaison Entre Index Arbre-B Et Bitmap
Les Index Pour Les Entrepôts de Données: Comparaison Entre Index Arbre-B Et Bitmap
Les Index Pour Les Entrepôts de Données: Comparaison Entre Index Arbre-B Et Bitmap
Résumé — Avec le développement des systèmes Abstract— With the development of decision
de décisionnel en générale et les entrepôts de systems and specially data warehouses, the
données de manière particulière, il est devenu visibility of the data warehouse design before its
primordiale d’avoir une visibilité de la creation has become essential, and that because
conception de l’entrepôt de données avant sa of data warehouse importance as considered as
création, et cela vu l’importance de l’entrepôt de the unique data source giving meaning to the
données qui se considère la source unique des decision. In a decision system the proper
données donnant sens à la décision. Dans un functioning of a data warehouse resides in the
système de décisionnel, le bon fonctionnement smooth running of the middleware tools ETC
d’un entrepôt de données réside dans le bon step one hand, and the restitution step through
déroulement de l’étape intergicielle des outils the data mining, reporting solutions,
ETC d’une part, et l’étape de restitution via le dashboards… etc other. The large volume of data
Datamining, des progiciels de reporting, des that passes through these stages require an
tableaux de bords…etc d’autre part. La grande optimal design for a highly efficient decision
volumétrie des données qui passes par ces étapes system, without disregarding the choice of
exigent une conception optimale pour un système technologies that are introduced for the data
de décisionnel très performant, sans négliger le warehouse implementation such as: database
choix des technologies y introduit pour la mise en management system, the type of server operating
place d’un entrepôt de données tel que : le systems, physical server architecture (64-bit, for
système de gestion de base de données, la nature example) that can be a benefit performance of
des systèmes d’exploitations du serveur, this system. The designer of the data warehouse
l’architecture physique des serveurs (64 bits par should consider the effectiveness of data query,
exemple) qui peuvent être un avantage de this depends on the selection of relevant indexes
performance du dit système. Le concepteur de and their combination with the materialized
l’entrepôt de données devra prendre en views, note that the index selection is a NP-
considération l’efficacité de l’interrogation des complete problem, because the number of indexes
données, cette efficacité repose sur la sélection is exponential in the total number of attributes in
d’index pertinents et leur combinaison avec les the database, So, it is necessary to provide, while
vues matérialisé, à noter que La sélection d’index the data warehouse design, the suitable type of
est un problème NP-complet car le nombre index for this data warehouse.
d’index est exponentiel en nombre total
d’attributs dans la base, il faut donc prévoir, lors This paper presents a comparative study between
de la conception d’un entrepôt de données, le type the index B-tree type and type Bitmap, their
d’index convenable à cet entrepôt. advantages and disadvantages, with a real
experiment showing that its index of type Bitmap
Cet article présente une étude comparative sur more advantageous than the index B-tree type.
entre les index de type arbre B et de type Bitmap,
leurs avantages et inconvénients, avec une Keywords: Data Warehouse DBMS, indexes,
expérimentation réelle démontrant que les index business intelligence.
de type Bitmap son plus avantageux que les index
de type arbre-B.
Cet article est répartit comme suit, après la Pour illustrer le fonctionnement d’un index Bitmap
présentation du contexte et les travaux liés avec on prend un exemple E.E-O’Neil et P.P-O’Neil [12].
(section 2), puis une présentation des hypothèses « Table 1 illustre un index de type bitmap basic dans
(section 3) une expérimentation sera réalisé pour une table contenant 9 enregistrements, où l’index est
déterminer des résultats concrets (section 4). Nous créé dans la colonne C avec des entiers allant de 0 à
terminons par une conclusion et des perspectives de 3, on dit que la cardinalité de la colonne C est 4, par
recherches (section 5) ce que on a 4 valeurs distincts [0, 1, 2, 3], d’où
l’index bitmap de C contiens 4 Bitmaps indiqués
II- Présentation de l’axe de comme B0, B1, B2 et B3 correspondant la valeur
recherche representé. Dans cet exemple, la première ligne où
RowID=0, la colonne C est de valeur 2, par
1. Index Bitmap conséquence, la colonne B2 est de valeur de bit
« 1 », pendant que les autres bitmaps sont mis à
1.1 Définition et exemple: « 0 ». Même chose pour la ligne suivante, où C=1
qui correspond à que le bitmap B1 est mis sur 1 et le
Un index bitmap est une structure de données reste à « 0 ». Ce processus se répète pour le reste des
définie dans un SGBD, utilisée pour optimiser lignes. [12]
l’accès aux données dans les bases de données. C’est
un type d’indexation qui est particulièrement
intéressant et performant dans le cadre des requêtes
de sélection. L’index bitmap d’un attribut est codé
1.2 Propriétés : la relation. Cette hypothèse n'est pas tout à fait exacte,
cependant. En réalité, un index bitmap est toujours
Les index bitmap possèdent une propriété très conseillé pour les systèmes dans lesquels les données ne
intéressante qui consiste à répondre à certains types sont pas souvent mises à jour par de nombreux systèmes
de requêtes sans retourner aux données elles-mêmes, concurrents. En fait, comme je vais démontrer ici, un
optimisant ainsi les temps de réponse. Cela est index bitmap sur une colonne avec des valeurs uniques
possible grâce aux opérations de comptage à 100% (un candidat de la colonne de clé primaire) est
(COUNT) et aux opérateurs logiques (AND, OR, aussi efficace qu'un index de B-arbre.
etc) qui agissent "bit à bit" sur les bitmaps.
Dans cet article je vais vous donner quelques
2. Index B-Arbre exemples, ainsi que les décisions de l'optimiseur, qui
sont communs aux deux types d'index sur une colonne
2.1 Définition de faible cardinalité ainsi qu'une grande cardinalité un.
Ces exemples aideront les DBA à comprendre que
L’index B-arbre stocke les pointeurs d’index et les
l'utilisation des index bitmap n'est pas en fait cardinal
valeurs à d’autres nœuds d’index en utilisant une
dépendante mais dépend de l'application.
structure d’arbre récursive. [3], [6], [7], [9], Les
données sont facilement relevées par les traces des IV- Expérimentation :
pointeurs. Le plus haut niveau de l’index est appelé
racine pendant que le niveau le plus bas on l’appelle L’expérimentation se déroule dans un serveur de base
nœud de feuille ou « leaf node ». [7] Tous les autres de données Oracle supportant OLAP. Il y en a plusieurs
niveaux entre eux sont appelés des branches ou inconvénients en utilisant un index de type bitmap dans
nœuds internes. Toutes les racines et les branches une colonne unique, l’un est le besoin de plus d’espace
contiennent des entrées qui pointent vers le niveau de disque. Cependant, la taille de l'index bitmap dépend
suivant de l’index. Nœuds feuilles se composent de de la cardinalité de la colonne sur laquelle il est créé,
la clé d’index et des pointeurs pointant vers ainsi que la répartition des données. Par conséquent, un
l’emplacement physique des enregistrements. Nous index bitmap sur la colonne « Genre » sera inférieur à
présentons plus de détails sur la structure d’index un index B-arbre sur la même colonne. En revanche, un
arbre-B[7]. index bitmap sur EMPNO (candidat à être clé primaire)
sera beaucoup plus grand qu'un index B-arbresur cette
La structure B-Arbre est utilisée par le serveur de colonne. Mais parce que moins d'utilisateurs accèdent
base de données pour configurer l’index (Figure1) aux systèmes décisionnel (DSS) qu’en accédant les
systèmes de traitement transactionnel (OLTP), les
ressources ne posent pas de problème pour ces
applications.
Index dropped.
Vous pouvez le voir dans le tableau ci-dessus que la SQL> create index normal_empno_idx on
test_normal(empno);
taille de l'index est 28 Mo et que le facteur de
regroupement est égal au nombre de lignes dans le Index created.
tableau. Maintenant, nous allons exécuter les SQL> analyze table test_normal compute
requêtes avec prédicats d'égalité pour les différents statistics for table for all indexes for
ensembles de valeurs: (Tableau 4) all indexed columns;
Table analyzed.
Etape 1B (sur TEST_NORMAL)
SQL> select substr(segment_name,1,30)
segment_name, bytes/1024/1024 "Size in MB"
Maintenant, nous allons laisser tomber cet index 2 from user_segments
bitmap et créer un index B-arbresur la colonne 3 where segment_name in
EMPNO. Comme précédemment, nous allons ('TEST_NORMAL','NORMAL_EMPNO_IDX');
INDEX_NAME CLUSTERING_FACTOR
---------------------------------- -----
-----------------------------
NORMAL_EMPNO_IDX 6210
Tableau 5
Il est clair dans ce tableau (Tableau 5) que les index Etape 2A (sur TEST_RANDOM)
B-Arbres est inférieur que l'index bitmap sur la
colonne EMPNO. Le facteur de regroupement de Maintenant, nous allons effectuer la même
l'index B-arbre est beaucoup plus proche du nombre expérience sur TEST_RANDOM (Tableau 8):
de blocs dans une table, pour cette raison, l'index B- SQL> create bitmap index random_empno_bmx
arbre est efficace pour les requêtes de prédicats. on test_random(empno);
Maintenant, nous allons exécuter les mêmes requêtes
Index created.
pour le même ensemble de valeurs, en utilisant notre
index B-arbre. SQL> analyze table test_random compute
statistics for table for all indexes for
all indexed columns;
SQL> set autotrace
SQL> select * from test_normal where Table analyzed.
empno=&empno;
Enter value for empno: 1000 SQL> select substr(segment_name,1,30)
old 1: select * from test_normal where segment_name, bytes/1024/1024 "Size in MB"
empno=&empno 2 from user_segments
new 1: select * from test_normal where 3* where segment_name in
empno=1000 ('TEST_RANDOM','RANDOM_EMPNO_BMX');
Elapsed: 00:00:00.01 SEGMENT_NAME Size in MB
------------------------------------
Execution Plan ---------------
-------------------------------------------- TEST_RANDOM 50
0 SELECT STATEMENT Optimizer=CHOOSE RANDOM_EMPNO_BMX 28
(Cost=4 Card=1 Bytes=34)
1 0 TABLE ACCESS (BY INDEX ROWID) OF SQL> select index_name, clustering_factor
'TEST_NORMAL' (Cost=4 Car from user_indexes;
d=1 Bytes=34)
2 1 INDEX (RANGE SCAN) OF INDEX_NAME CLUSTERING_FACTOR
'NORMAL_EMPNO_IDX' (NON-UNIQUE) (C ------------------------------ ----
ost=3 Card=1) -----------------------------
RANDOM_EMPNO_BMX 1000000
Statistics
-------------------------------------------- Tableau 8
29 recursive calls
0 db block gets Encore une fois, les statistiques (taille et le facteur
5 consistent gets
0 physical reads de regroupement) sont identiques à celles de l'index
0 redo size sur la table TEST_NORMAL (Tableau 9):
515 bytes sent via SQL*Net to
client
Elapsed: 00:00:00.01
499 bytes received via SQL*Net from
client
Execution Plan
2 SQL*Net roundtrips to/from
--------------------------------------------
client
--------------
0 sorts (memory)
0 SELECT STATEMENT Optimizer=CHOOSE
0 sorts (disk)
(Cost=4 Card=1 Bytes=34)
1 rows processed
1 0 TABLE ACCESS (BY INDEX ROWID) OF
Tableau 6 'TEST_RANDOM' (Cost=4 Card=1 Bytes=34)
2 1 BITMAP CONVERSION (TO ROWIDS)
Comme vous pouvez le voir (Tableau 7), lorsque les 3 2 BITMAP INDEX (SINGLE VALUE)
OF 'RANDOM_EMPNO_BMX'
requêtes sont exécutées pour des valeurs différentes,
le nombre de lectures cohérentes et des lectures Statistics
--------------------------------------------
physiques sont identiques pour bitmap et index B- --------------
arbre sur une colonne unique de 100%. 0 recursive calls
0 db block gets
5 consistent gets
BITMAP EMPNO B-TREE 0 physical reads
Consistent Physical Consistent Physical 0 redo size
Reads Reads Reads Reads 515 bytes sent via SQL*Net to
5 0 1000 5 0 client
5 2 2398 5 2 499 bytes received via SQL*Net from
5 2 8545 5 2 client
5 2 98008 5 2 2 SQL*Net roundtrips to/from
5 2 85342 5 2 client
5 2 128444 5 2 0 sorts (memory)
5 2 858 5 2 0 sorts (disk)
1 rows processed
Tableau 7
Tableau 9
Étape 2B (sur TEST_RANDOM) SQL> select * from test_random where
empno=&empno;
Enter value for empno: 1000
Maintenant, comme dans l'étape 1b, nous allons old 1: select * from test_random where
supprimer l'index bitmap et créer un index B-arbre empno=&empno
new 1: select * from test_random where
sur la colonne EMPNO. (Tableau 10) empno=1000
Elapsed: 00:00:00.08 Take a look at the size of the index and the clustering
factor.
Execution Plan
-------------------------------------------- SQL> select substr(segment_name,1,30)
0 SELECT STATEMENT Optimizer=CHOOSE segment_name, bytes/1024/1024 "Size in MB"
(Cost=39 Card=168 Bytes=4032) 2 from user_segments
1 0 TABLE ACCESS (BY INDEX ROWID) OF 3 where segment_name in
'TEST_NORMAL' (Cost=39 Card=168 Bytes=4032) ('TEST_NORMAL','NORMAL_SAL_IDX');
2 1 BITMAP CONVERSION (TO ROWIDS)
3 2 BITMAP INDEX (SINGLE VALUE) SEGMENT_NAME Size in MB
OF 'NORMAL_SAL_BMX' ------------------------------ ------
---------
Statistics TEST_NORMAL 50
-------------------------------------------- NORMAL_SAL_IDX 17
0 recursive calls
0 db block gets SQL> select index_name, clustering_factor
165 consistent gets from user_indexes;
0 physical reads
0 redo size INDEX_NAME CLUSTERING_FACTOR
8461 bytes sent via SQL*Net to ------------------------------ ------
client ----------------------------
609 bytes received via SQL*Net from NORMAL_SAL_IDX 986778
client Tableau 22
12 SQL*Net roundtrips to/from
client
0 sorts (memory) SQL> set autotrace
0 sorts (disk) SQL> select * from test_normal where
164 rows processed sal=&sal;
Enter value for sal: 1869
old 1: select * from test_normal where
Tableau 20 sal=&sal
new 1: select * from test_normal where
SQL> select * from test_normal where sal sal=1869
between &sal1 and &sal2;
Enter value for sal1: 1500 164 rows selected.
Enter value for sal2: 2000
old 1: select * from test_normal where sal Elapsed: 00:00:00.01
between &sal1 and &sal2
new 1: select * from test_normal where sal Execution Plan
between 1500 and 2000 --------------------------------------------
--------------
83743 rows selected. 0 SELECT STATEMENT Optimizer=CHOOSE
Elapsed: 00:00:05.00 (Cost=169 Card=168 Bytes=4032)
1 0 TABLE ACCESS (BY INDEX ROWID) OF
Execution Plan 'TEST_NORMAL' (Cost=169 Card=168 Bytes=4032)
-------------------------------------------- 2 1 INDEX (RANGE SCAN) OF
0 SELECT STATEMENT Optimizer=CHOOSE 'NORMAL_SAL_IDX' (NON-UNIQUE) (Cost=3
(Cost=601 Card=83376 Bytes Card=168)
=2001024)
1 0 TABLE ACCESS (FULL) OF Statistics
'TEST_NORMAL' (Cost=601 Card=83376 --------------------------------------------
Bytes=2001024) --------------
0 recursive calls
Statistics 0 db block gets
-------------------------------------------- 177 consistent gets
0 recursive calls 0 physical reads
0 db block gets 0 redo size
11778 consistent gets 8461 bytes sent via SQL*Net to
5850 physical reads client
0 redo size 609 bytes received via SQL*Net from
4123553 bytes sent via SQL*Net client client
61901 bytes received via SQL*Net from 12 SQL*Net roundtrips to/from
client client
5584 SQL*Net roundtrips to/from 0 sorts (memory)
client 0 sorts (disk)
0 sorts (memory) 164 rows processed
0 sorts (disk) Tableau 23
83743 rows processed
Tableau 21
Dans la table ci-dessus, vous pouvez voir que cet BITMAP SAL B-TREE Rows
(Range) Consistent Fetched
index est supérieur à l'index bitmap sur la même Consistent Physical Physical
Reads Reads Reads Reads
colonne. Le facteur de regroupement est également 11778 5850 1500- 11778 3891 83743
proche du nombre de lignes dans cette table. 2000
11765 5468 2000- 11765 3879 83328
Maintenant, pour les essais; prédicats d'égalité en 2500
premier (Tableau 23), et après prédicats 11753 5471 2500- 11753 3884 83318
3000
d’intervalles (Tableau 24).
17309 5472 3000- 17309 3892 166999
4000
SQL> select * from test_normal where sal
between &sal1 and &sal2; 39398 5454 4000- 39398 3973 500520
Enter value for sal1: 1500 7000
Enter value for sal2: 2000 Tableau 26
old 1: select * from test_normal where sal
between &sal1 and &sal2
new 1: select * from test_normal where sal Pour l’intervalle de prédicats l'optimiseur opté pour
between 1500 and 2000 un scan de table complet pour tous les différents
83743 rows selected. ensemble de valeurs qu'il, n'a pas du tout utilisé les
index, tandis que pour les prédicats d'égalité,
Elapsed: 00:00:04.03
l'optimiseur a utilisé les index. Encore une fois, les
Execution Plan lectures cohérents et lectures physiques sont
--------------------------------------------
--------------
identiques. Par conséquent, on peut conclure que
0 SELECT STATEMENT Optimizer=CHOOSE pour une colonne de normale cardinal, les décisions
(Cost=601 Card=83376 Bytes
=2001024)
de l'optimiseur pour les deux types d'index sont les
1 0 TABLE ACCESS (FULL) OF mêmes et il n'y avait pas de différences
'TEST_NORMAL' (Cost=601 Card=83376 significatives entre les E/S.
Bytes=2001024)
Statistics
--------------------------------------------
--------------
Étape 6 (ajouter une colonne GENDER)
0 recursive calls
0 db block gets Avant d'effectuer le test sur une colonne basse
11778 consistent gets
3891 physical reads
cardinal, nous allons ajouter une colonne de genre
0 redo size dans ce tableau et le mettre à jour avec M, F et les
4123553 bytes sent via SQL*Net to
client
valeurs NULL.
61901 bytes received via SQL*Net from
client
5584 SQL*Net roundtrips to/from
client SQL> alter table test_normal add GENDER
0 sorts (memory) varchar2(1);
0 sorts (disk)
83743 rows processed Table altered.
Tableau 24
SQL> select GENDER, count(*) from
test_normal group by GENDER;
Lorsque les requêtes ont été exécutées pour des
valeurs différentes, le résultat obtenu, comme S COUNT(*)
indiqué dans les tableaux ci-dessous, révèle que le - ----------
F 333769
nombre des lectures cohérent et des lectures M 499921
physiques sont identiques. 166310
3 rows selected.
BITMAP SAL B-TREE Rows
(Equality) Consistent Fetched
Tableau 27
Consistent Physical Physical
Reads Reads Reads Reads
165 0 1869 177 164
169 163 3548 181 167
174 166 6500 187 172
75 69 7000 81 73
177 163 2500 190 175
Tableau 25
La taille de l'index bitmap sur cette colonne est SQL> select * from test_normal where GENDER
is null;
d'environ 570KB, comme indiqué dans la table ci-
dessous.(Tableau 28) En revanche, l'index B-arbre 166310 rows selected.
sur cette colonne est 13MB en taille, ce qui est Elapsed: 00:00:06.08
beaucoup plus grand que l'index bitmap sur cette
Execution Plan
colonne.(Tableau 29) --------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
SQL> create bitmap index normal_GENDER_bmx (Cost=601 Card=166310 Bytes=4157750)
on test_normal(GENDER); 1 0 TABLE ACCESS (FULL) OF
'TEST_NORMAL' (Cost=601 Card=166310
Index created. Bytes=4157750)