web-dev-qa-db-fra.com

Comment modifier ma table existante pour créer une partition de plage dans Oracle

J'ai une table existante qui a 10 ans de données (j'ai pris le vidage).

Je voudrais répartir la table existante sur une colonne clé de date dans la table.

La plupart des exemples que je vois concernent CREATE TABLE..PARTITION BY RANGE... pour ajouter de nouvelles partitions. Mais ma table est une table existante.

Je suppose que j'ai besoin d'une instruction ALTER.

ALTER TABLE TABLE_NAME
PARTITION BY RANGE(CREATED_DATE)
 PARTITION JAN16 VALUES LESS THAN (01-02-2016),
 PARTITION FEB16 VALUES LESS THAN (01-03-2016) AND GREATER THAN(31-01-2016),//OR?
 PARTITION MAR16 VALUES BETWEEN (01-03-2016) AND (31-03-2016),  //OR?

Deux questions..

  1. Ai-je besoin d'une instruction Alter pour ajouter un mécanisme de partitionnement ou dois-je travailler avec une instruction create?

  2. Quelle est la syntaxe appropriée pour conserver chaque partition contenant uniquement des données UN MOIS.

9
Some Java Guy

Beacuse votre table non partitionnée vous avez deux options:

  1. Exporter des données, déposer une table, créer une nouvelle table brevetée, importer des données.
  2. Utilisez la méthode de partitionnement puis d'échange. https://Oracle-base.com/articles/misc/partitioning-an-existing-table-using-exchange-partition

De plus, si vous voulez une nouvelle partition par mois, lisez la section SET INTERVAL. Par exemple:

CREATE TABLE tst
   (col_date DATE)
 PARTITION BY RANGE (col_date) INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(PARTITION col_date_min VALUES LESS THAN (TO_DATE('2010-01-01', 'YYYY-MM-DD')));
2
hinotf

Si vous utilisez Oracle 12c Release 2 vous pouvez utiliser un seul ALTER pour convertir une table non partitionnée en une table partitionnée (c'est un aller simple):

CREATE TABLE my_tab ( a NUMBER(38,0), b NUMBER(38,0)); 

ALTER TABLE MY_TAB MODIFY PARTITION BY RANGE (a) INTERVAL (1000) (   
    PARTITION p1 VALUES LESS THAN (1000)) ONLINE;

Vous pouvez également convertir des index en ajoutant:

update indexes (index_name [local/global]);

démo db <> violon

2
Lukasz Szozda