Les tables partitionnées

Lorsque les volumétries commencent à devenir importantes (plusieurs dizaines de millions de lignes), il est recommandé d'utiliser le partitionnement des tables volumineuses. Cette méthode de tuning est une option d'oracle introduite en 8i qui peut rapidement être rentabilisée.

Principe :
Une table partitionnée est vue pour le développeur comme une unique table mais comme plusieurs par le moteur Oracle.
Ainsi selon le critère de partitionnement, Oracle n'interrogera que la(les) partition(s) concernée(s).
Cette notion s'étend également aux index qui peuvent être locaux ou globaux, respectivement propre à la partition ou sur l'ensemble de la table.
Pour encore plus de performances, chaque partition (voire sous-partition) sera stockée sur son tablespace propre.

Le partitionnement d'une table s'effectue sur un (ou deux) critères. Ce(s) critère(s) déterminera(ront) sur quelle partition (partition Oracle, différent de partition système) un tuple doit être stocké.
Trois types de déterminations (primaires) de la partition existent :
hash : les partitions sont attribuées automatiquement par Oracle (à partir d'un algorithme de hashage).
range : on associe une partition à une plage de valeur de la colonne (ex pourcentage)
list : on associe une partition à une (des) valeur(s) de la colonne (idéal pour un nombre réduit de valeur, à savoir une catégorie par exemple).

Un partitionning composite permet de combiner deux méthodes de partitionning (sur des colonnes différentes) ; mais le partitionning primaire doit être LIST ou RANGE, le secondaire est HASH ; on parle alors de partitions associées à des sous-partitions.

A partir de ces tables, toutes opérations classiques sur les tables restent compatibles (vue, trigger, ...).

Création d'une table partitionnée



create table t_evenement (
id NUMBER(10),
date_ev DATE,
type_ev varchar2(50),
user varchar2(120),
data VARCHAR2(50)
)
PARTITION BY RANGE (date_ev)
SUBPARTITION BY LIST (type_ev)
PARTITION siecle_der VALUES LESS THAN (TO_DATE('01/01/2000','DD/MM/YYYY')
(SUBPARTITION siecle_der_aj VALUES ('AJOUT') tablespace tbs_sa,
SUBPARTITION siecle_der_modif VALUES ('MODIFICATION') tablespace tbs_sm,
SUBPARTITION siecle_der_supp VALUES ('SUPPRESSION') tablespace tbs_ss
),
PARTITION annee_der VALUES LESS THAN (TO_DATE('01/01/2008','DD/MM/YYYY')
(SUBPARTITION annee_der_aj VALUES ('AJOUT') tablespace tbs_aa,
SUBPARTITION annee_der_modif VALUES ('MODIFICATION') tablespace tbs_am,
SUBPARTITION annee_der_supp VALUES ('SUPPRESSION') tablespace tbs_as
),
PARTITION en_cours VALUES LESS THAN (MAXVALUE)
(SUBPARTITION en_cours_aj VALUES ('AJOUT') tablespace tbs_ea,
SUBPARTITION en_cours_modif VALUES ('MODIFICATION') tablespace tbs_em,
SUBPARTITION en_cours_supp VALUES ('SUPPRESSION') tablespace tbs_es
)


Les critères de partitionnement doivent être évalués (on ne peut pas spécifier dans la clause de condition de stockage la date du jour par exemple), la seule fonction permise est to_date (pas de decode() par exemple) ; cependant, à partir de la version 11g, Oracle a introduit la notion de colonne virtuelle, ce qui permet de dépasser cette limite.

Lors du changement d'année (à partir du premier janvier 2009 par exemple), il sera interressant de revoir le stockage afin de reconsidérer les données stockées dans la partition "en_cours".
Dans ce cas, il faudra utiliser l'ordre SPLIT permettant de redécouper la partition selon le nouveau critère :

alter table t_evenement split partition en_cours at TO_DATE('01/01/2009') into (partition annee_der, partition en_cours)
update global indexes;


Création d'index sur une table partitionnée


Une table partitionnée peut, comme toute table utiliser des index afin d'accélérer les recherches.
Mais selon les requêtes de sélection, il faut distinguer la création d'un index global (par défaut) ou local (au sein de chacune partition)

create index idx_evt on t_evenement(user);

permettra de chercher, quelque soit la date et le type, les activité d'un user.

Mais

create index idx_evt on t_evenement(user) local;

sera préféré si le but de l'index porte sur des recherches contenant également les critères des partitions (et sous-partitions).




Vous n'avez pas trouver réponse à votre question ? Préciser votre recherche :

Catégories