Sunteți pe pagina 1din 3

Oracle - Partitionnement de table - mettre en place des index

Introduction

Vous n'avez pas oubli ma table Reponse_1_P avec ses quelques dizaines de millions de
lignes ?
Tant mieux, car on va en reparler encore un peu.
Juste pour rappel, la table est partionne par date, puis sous-partionn par questionnaire.
Plusieurs choses peuvent arriver cette table :

1. Quotidiennement de nouvelles donnes vont tre intgres


2. On va utiliser cette table pour crer de nouvelles tables d'aggrgations (calcul de moyenne
par exemple) afin de rendre les requtes moins couteuses
3. On va devoir sauvegarder.
4. Et de temps en temps purger un peu !

Mais avent tout, sachant que bon nombre de requtes vont porter sur le pays en plus de la
date et du type de questionnaire, il serait peut-tre bon d'indexer la colonne ID_PAYS.

Cration de l'index

Rien d'extraordinaire me direz vous:

CREATE INDEX Idx_Pays ON Reponse_1_P(Date_Questionnaire,Id_Pays);


C'est effectivement une possibilit mais dans ce cas, l'index sera GLOBAL la table, alors
que des le dpart il tait question que les interrogations portent sur une date et un type de
questionnaire.
Pour simplifier cela signifie que nos requtes vont porter non pas sur l'ensemble de la table
(mme si rien nous en empeche), mais plutt sur les partitions et sous-partitions.
Oracle permet de crer des indexes propres la partition.
Il suffit pour cela d'ajouter la clause "LOCAL"
CREATE INDEX Idx_Pays ON Reponse_1_P(Date_Questionnaire,Id_Pays) LOCAL;
Les avantages sont multiples :
1. Possibilit de reconstruire les indexes par partitions et donc de dcouper la maintenance de
l'index dans le temps.
2. Lors de l'ajout de nouvelles donnes dans une nouvelle partition, l'index sera mis jour
uniquement au niveau partition et non pas de facon globale. Or sur des tables de plusieurs
centaines de millions de lignes l'impact n'est pas ngligeable.
Cration d'un index partitionn

Il existe deux types partionnement d'index.

1. Local - Toutes les entres d'index dans une seule partition correspondra une table de
partition unique ("equipartitioned"). Ils sont crs avec le mot cl LOCAL. Equipartioning
permet oracle d'tre plus efficace pour laborer des plans de requte.
2. Global - L'index dans une seule partition peut correspondre plusieurs partitions de tables. Ils
sont crs avec le mot cl GLOBAL et ne prend pas en charge l'indpendance des partitions.
L'index GLOBAL ne peut tre partitionn qu'avec l'option RANGE PARTIONNED et de faon
"equipartitioned", mais Oracle ne sera pas profiter de cette structure.

Les deux types d'indices peuvent tre subdivises :

1. Prefixed - La cl de partition est la colonne de gauche de l'indice. Sonder ce type d'indice est
moins coteux. Si une requte prcise la cl de partition dans la clause where alors
seulement la partition dfini sera sond, sinon toutes les partitions seront sond.

2. Non-Prefixed - Ne supporte pas la cl de partition, mais il est efficace pour accder des
donnes couvrant plusieurs partitions. Souvent utilis pour l'indexation d'une colonne qui n'est
pas la cl de partition de la tables, quand vous voulez partitionn l'index sur la mme colonne
que la table sous-jacente.
Local Prefixed Indexes

En supposant que la table INVOICE est partitionn par RANGE sur INVOICE_DATE.
L'exemple qui suit est un index prfixs.
La colonne indexe correspond la cl de partition.

CREATE INDEX invoices_idx ON invoices (invoice_date) LOCAL;


CREATE INDEX invoices_idx ON invoices (invoice_date) LOCAL
(PARTITION invoices_q1 TABLESPACE users,
PARTITION invoices_q2 TABLESPACE users,
PARTITION invoices_q3 TABLESPACE users,
PARTITION invoices_q4 TABLESPACE users);
Oracle va gnrer les noms de partition et construire les partitions dans le tablespace par
dfaut en utilisant la taille par dfaut.
Local Non-Prefixed Indexes

En supposant que la table INVOICE est partitionn par RANGE sur INVOICE_DATE.
L'exemple qui suit est un index non-prfixs.
La colonne indexe ne correspond pas la cl de partition.

CREATE INDEX invoices_idx ON invoices (invoice_no) LOCAL


(PARTITION invoices_q1 TABLESPACE users,
PARTITION invoices_q2 TABLESPACE users,
PARTITION invoices_q3 TABLESPACE users,
PARTITION invoices_q4 TABLESPACE users);
Global Prefixed Indexes

En supposant que la table INVOICE est partitionn par RANGE sur INVOICE_DATE.
L'exemple qui suit est un index global prfixs.

CREATE INDEX invoices_idx ON invoices (invoice_date)


GLOBAL PARTITION BY RANGE (invoice_date)
(PARTITION invoices_q1 VALUES LESS THAN (TO_DATE('01/04/2001', 'DD/MM/YYYY'))
TABLESPACE users,
PARTITION invoices_q2 VALUES LESS THAN (TO_DATE('01/07/2001', 'DD/MM/YYYY'))
TABLESPACE users,
PARTITION invoices_q3 VALUES LESS THAN (TO_DATE('01/09/2001', 'DD/MM/YYYY'))
TABLESPACE users,
PARTITION invoices_q4 VALUES LESS THAN (MAXVALUE) TABLESPACE users);
Notez que les valeurs de la plage de partition doivent tre spcifie.
Le mot cl GLOBAL signifie que Oracle ne peut pas assumer la cl de partition qui est la
mme que la table sous-jacente.
Conclusion

D'une facon gnrale, Oracle recommande d'utiliser les indexes de type local dans un
environnement type Datawarehouse.
En effet, une maintenance sur une des partitions la table rendrait l'index invalide.
Dans le cas d'un index global, c'est tout l'index qui serait invalide et le cout de la
reconstruction de l'index serait couteux.
Depuis Oracle 10, il est possible d'effectuer une maintenance d'index aprs un DDL sans
rendre l'index inutilisable.

La recommandation d'utiliser des index de type local reste cependant d'actualit.


Des indexex bitmap sur une table partitionne sont toujours de type local.

Encore une fois, on se rend compte que les options que proposent ORACLE sont
nombreuses et que lorsque on implmente une fonction avance d'ORACLE, il convient de se
documenter un minimum au risque de se retrouver avec des problmes de peformance ou
d'administration complexes rsoudre de part les contraintes de disponibilits et des
volumtries en jeu.

S-ar putea să vă placă și