Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
LAMI DBA

Articles autour des SGBD Oracle, SQL Server & PostgreSQL

Oracle 12C R2 - Automatic List Partitioning - ORA-14400

Hello,


Je vais vous parler aujourd'hui de quelque chose qui a été introduit avec la version 12c R2 : Automatic List Partitioning.
Vue le nom, je pense que tout le monde a compris ce que cela fait, mais histoire que l'article ne s'arrête pas la, la preuve par l'exemple avec évidemment un petit case de test.

SQL>
SQL> create table clients (idclient number, departement number, nomclient varchar2(50)) partition by list (departement)
  2  (
  3  partition p78 values (78),
  4  partition p75 values (75),
  5  partition p95 values (95)
  6  );

Table created.

SQL>


Nous avons donc notre table clients partitionnée par département. Insérons quelques clients.

 

SQL>
SQL> insert into clients values (1,78,'rasta');

1 row created.

SQL> insert into clients values (2,95,'romeo');

1 row created.

SQL> insert into clients clients values (3,75,'jumbo');

1 row created.

SQL> commit;

Commit complete.

SQL>


Tout se passe bien. Mes lignes sont insérées. Que se passe t-il maintenant si je veux insérer une ligne avec un client provenant du 92.

SQL>
SQL> insert into clients values (4,92,'prettyboy');
insert into clients values (4,92,'prettyboy')
            *
ERROR at line 1:
ORA-14400: inserted partition key does not map to any partition


SQL>


Patatra ! Ma table est partitionnée par liste, et je n'ai pas prévu la partition pour le département 92. Cela a pu être fait à raison. Il n'y a aucune raison de créer des partitions si a priori il n'y aura rien dedans. Mais Oracle dans sa bonté inégalable a pensé à nous avec le "Automatic List Partitioning"

SQL>
SQL> alter table clients set PARTITIONING AUTOMATIC;

Table altered.

SQL>
SQL>  insert into clients values (4,92,'prettyboy');

1 row created.

SQL> commit;

Commit complete.

SQL>


Et voila plus d'erreur ! Evidemment, si l'objectif est de ne pas avoir de plantage, il aurait fallu créer la table le partitioning Automatic activé. Pour le bon déroulement de l'article, j'ai d'abord voulu être bloqué dans l'insertion.
La confiance n'excluant pas le contrôle.On peut vérifier rapidement ce qu'il s'est passé au niveau de mes partitions.


La colonne num_rows n'est pas renseigné et j'en suis le seul coupable ;) Les stats n'ont pas été calculé sur ma table. Qu'à cela ne tienne..

SQL>
SQL> exec dbms_stats.gather_table_stats('LAO','CLIENTS',cascade=>TRUE);
PL/SQL procedure successfully completed.
SQL>


Et hop


Nous avons bien nos trois partitions créées initialement plus la partition crée à la volée par notre ami Oracle. Oracle n'a pas poussé l'IA jusqu'à la nommer correctement mais c'est quand même mieux qu'un plantage. Il conviendra de prévoir des temps de maintenance pour eventuellement renommer, merger, splitter nos partitions... Mais cela fera l'objet de nouveaux articles.

ATTENTION : Pour utiliser le partitioning, il faut :

  1. Disposer d'une version Oracle Enterprise
  2. Disposer de l'option ("Extra Cost) Oracle Partitioning.

Enjoy ;)

 

Partager cet article
Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article