Example partition range date oracle 8

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Exemple DDL Oracle
Contexte Partitionnement par intervalle de dates (RANGE), disponible depuis Oracle8
Voir aussi Example create table · Example create tablespace

Le partitionnement RANGE (le seul type de partitionnement disponible en Oracle8 — les partitionnements LIST et HASH sont apparus respectivement en 9i et 8i) découpe une table en segments physiques distincts selon la plage de valeurs d'une colonne, typiquement une date. Chaque partition peut résider dans un tablespace différent, ce qui permet par exemple de répartir la charge disque par trimestre ou de basculer les partitions anciennes sur un stockage moins coûteux.

Intérêt pour une table datée

 les données d'un seul trimestre sans toucher au reste de la table.
  • Élagage de partitions (partition pruning) : une requête filtrant sur la colonne de
 partitionnement (ici hire_date) ne lit que les partitions concernées, pas la
 table entière.
  • Ajout de nouvelles périodes au fil du temps via ALTER TABLE ... ADD PARTITION,
 sans reconstruire la table.

La clause VALUES LESS THAN définit la borne haute exclusive de chaque partition ; en Oracle8, seules les fonctions TO_DATE et RPAD y sont autorisées.

Script

CONNECT scott/tiger

-- Nettoyage préalable (idempotence du script)
DROP TABLE emp_date_part CASCADE CONSTRAINTS
/

-- Table partitionnée par plage de dates (une partition par trimestre 2001),
-- chaque partition dans son propre tablespace
CREATE TABLE emp_date_part (
    empno      NUMBER(15) NOT NULL
  , ename      VARCHAR2(100)
  , sal        NUMBER(7,2)
  , hire_date  DATE NOT NULL
)
TABLESPACE users
STORAGE (
  INITIAL     128K
  NEXT        128K
  PCTINCREASE 0
  MAXEXTENTS  UNLIMITED
)
PARTITION BY RANGE (hire_date) (
  PARTITION emp_date_part_q1_2001_part
    VALUES LESS THAN (TO_DATE('01-APR-2001', 'DD-MON-YYYY'))
    TABLESPACE part_1_data_tbs
  , PARTITION emp_date_part_q2_2001_part
    VALUES LESS THAN (TO_DATE('01-JUL-2001', 'DD-MON-YYYY'))
    TABLESPACE part_2_data_tbs
  , PARTITION emp_date_part_q3_2001_part
    VALUES LESS THAN (TO_DATE('01-OCT-2001', 'DD-MON-YYYY'))
    TABLESPACE part_3_data_tbs
  , PARTITION emp_date_part_q4_2001_part
    VALUES LESS THAN (TO_DATE('01-JAN-2002', 'DD-MON-YYYY'))
    TABLESPACE part_4_data_tbs
)
/

Les tablespaces part_1_data_tbs à part_4_data_tbs doivent exister au préalable (voir Example create tablespace) ; une table non partitionnée classique n'utilise qu'un seul tablespace, indiqué juste après la liste de colonnes.

Maintenance courante

Ajouter une nouvelle partition pour un trimestre suivant :

ALTER TABLE emp_date_part
  ADD PARTITION emp_date_part_q1_2002_part
  VALUES LESS THAN (TO_DATE('01-APR-2002', 'DD-MON-YYYY'))
  TABLESPACE part_1_data_tbs;

Purger une partition devenue obsolète (plus rapide qu'un DELETE — pas de génération de undo ligne par ligne) :

ALTER TABLE emp_date_part DROP PARTITION emp_date_part_q1_2001_part;

Voir aussi