Oracle
 sql >> Base de données >  >> RDS >> Oracle

Dois-je partitionner/sous-partitionner ma table ?

Vous pouvez essayer de cette manière :utilisez INTERVAL pour indiquer à Oracle de créer des partitions automatiques. Vous devez définir une colonne (nombre ou date) et un intervalle (dans mon exemple 1 mois). Oracle mettra dans la même partition toutes les lignes dans le même intervalle (dans ce cas dans le même mois). Si la partition n'existe pas, elle sera créée.

create table log(
       id_dispositive    number,
       date    date,
       status  number,
       type    number
)
partition by range (date)                              
interval (numtoyminterval(1,'MONTH'))(
   partition p0701 values less than (to_date('2007-02-01','yyyy-mm-dd'))
);

La même chose peut être faite également avec la colonne de type. Plus d'informations :http://www.oracle.com/ technetwork/articles/sql/11g-partitioning-084209.html .

Chaque partition peut être sous-partitionnée à l'aide de la clé TEMPLATE.

create table log(
       id_dispositive    number,
       date    date,
       status  number,
       type    number
)
partition by range (date) interval (numtoyminterval(1,'MONTH'))
subpartition by list (type)  
subpartition TEMPLATE (
    SUBPARTITION types1 VALUES (1, 2) TABLESPACE tbs_1,
    SUBPARTITION types2 VALUES (3, 4) TABLESPACE tbs_1
)                          
(
   partition p0701 values less than (to_date('2007-02-01','yyyy-mm-dd'))
);

Dans ce cas, vous ne pouvez pas créer de sous-partition automatique, si un nouveau type est ajouté, vous devez exécuter une instruction alter table. Ici plus d'informations; https://docs.oracle.com/cd /B28359_01/server.111/b32024/part_admin.htm#i1006655 .

Dans votre exemple :

create table prova_log(
       id_dispositive    number,
       type       number,
       date_verification    date,
       status  number
)
partition by range (date_verification) interval (numtoyminterval(1,'MONTH'))
subpartition by list (type)  
subpartition TEMPLATE (
    SUBPARTITION type1 VALUES (1),
    SUBPARTITION type2 VALUES (2),
    SUBPARTITION type3 VALUES (3),
    SUBPARTITION type4 VALUES (4)
)                          
(
   partition p0816 values less than (to_date('01/09/2016','dd/mm/yyyy'))
);

Si vous essayez d'insérer :

insert into prova_log values (1,1,TO_DATE('10/10/2016','dd/mm/yyyy'),1);

vous verrez 2 partitions sur votre table.

Maintenant je l'ai testé !