La version 12c de oracle Database a introduit une fonctionnalité intéressante vis à vis des données dites d'archives. Il est en effet courant de stocker des milliers, voir des millions de lignes dans des tables et qui ne sont jamais ou très peu utilisées. Ceci peut être particulièrement gênant dans le cas d'une recherche où seules les informations récentes sont souhaitées.
Pour palier à ceci il est fréquent de positionner dans la table un flag disant que l'on prend en compte la ligne ou pas. La fonction In-Database Archiving ou IDA gère ceci de manière plus souple.
Soit la table suivante :
create table personne ( code char(2), prenom char(15), constraint personne_pk primay key ( code)); insert into personne values ('01','Alice'); insert into personne values ('02','Bob'); insert into personne values ('03','Carmen'); commit;
Ici la ligne 03 - Carmen va être jugée non pertinente pour les recherches. Dans le concept IDA les données sont déclarées soit actives, soit archivées. Une donnée marquée archivée devient invisible pour l'application et est stockée sous forme compressée. L'activation est simple soit à la création de la table:
create table personne ( code char(2), prenom char(15), constraint client_pk primary key (code)) row archival;
Soit à postériori
alter table personne row archival;
La commande suivante désactive ce mode
alter table personne no row archival;
L'activation ajoute une colonne de plus à la table (ORA_ARCHIVE_STATE ) . Cette colonne n'est toutefois pas visible par la commande DESC, il faut interroger la table USER_TAB_COLS.
SELECT column_id, column_name, data_type, data_length, hidden_column FROM user_tab_cols WHERE table_name = 'PERSONNE' ORDER BY column_id COLUMN_ID COLUMN_NAME DATA_TYPE DATA_LENGTH HIDDEN_CO ---------- -------------------- -------------------- ----------- --------- 1 CODE CHAR 2 NO 2 PRENOM CHAR 15 NO SYS_NC00003$ RAW 126 YES ORA_ARCHIVE_STATE VARCHAR2 4000 YES
Par défaut la valeur de ORA_ARCHIVE_STATE est à "0"
select ora_archive_state, count(*) from personne group by ora_archive_state; ORA COUNT(*) --- ---------- 0 3
L'exemple suivant présente la fonctionnalité.
select * from personne; CODE PRENOM ------ --------------------------------------------- 01 Alice 02 Bob 03 Carmen
Il peut au premier abord évident d'utiliser ceci pour archiver la ligne code = '03' par exemple : update personne set ora_archive_state='1' where code='03'; Il est conseillé toutefois de ne pas utiliser un update simple comme ici mais de passer par le package. dbms_ilm et la fonction archivestatename.
update personne set ora_archive_state=dbms_ilm.archivestatename(1) where code='03'; commit; select * from personne; CODE PRENOM ------ --------------------------------------------- 01 Alice 02 Bob select ora_archive_state, count(*) from personne group by ora_archive_state; ORA_ARCHIVE_STATE COUNT(*) ----------------- -------- 1 1 0 2
Pour voir les lignes archivées il faut demander la visibilité de toutes les lignes
alter session set row archival visibility=all; select * from personne; CODE PRENOM ------ --------------------------------------------- 01 Alice 02 Bob 03 Carmen
Si on souhaite modifier l'état pour la ligne code '03' il faut au préalable activer la visibilité. La commande suivante réactive l'invisibilité des lignes archivées.
alter session set row archival visibility=active; select * from personne; CODE PRENOM ------ --------------------------------------------- 01 Alice 02 Bob
Attention cette fonctionnalité ne fonctionne que sur le bases non-CDB en 12.1, par contre elle est étendue au CDB en version 12.2.