通常,在应用程序开发中对表做设计时,不可避免的会对表中的数据做删除处理,如果直接使用硬删除,则不能有效的对已删除的数据进行追踪;如果采用软删除(例如表中增加了删除标记的字段delete_flag),虽然可以对已删除的字段进行追踪,但如果使用未删除的数据时,需要加上delete_flag='N',这种带删除标记的数据对应用来说是可见的,而且占用一定的存储空间。那么,有没有一种更有效的技术,可以让数据的删除或归档更高效呢?
Oracle 12.1.0.1 版本引入了In-Database Archiving(数据库内归档),通过这一新特性,可以将表中的数据行标记为非活动(Inactive)状态来对其进行归档,这些非活动数据行对应用来说不可见的,并且可以通过压缩进行优化。
要管理表的In-Database Archiving(数据库内归档),必须启用表的ROW ARCHIVAL(行归档)并操作表的ORA_ARCHIVE_STATE隐藏列,本篇对In-Database Archiving进行介绍和演示。
1 数据库版本
ALEN@PROD2> select * from v$version;
BANNER CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 0
PL/SQL Release 12.1.0.2.0 - Production 0
CORE 12.1.0.2.0 Production 0
TNS for Linux: Version 12.1.0.2.0 - Production 0
NLSRTL Version 12.1.0.2.0 - Production 0
2 启用行归档
ALEN@PROD2> create table alen(id number,name varchar2(200)) row archival;
Table created.
开启行归档后,会在表新增一个隐藏列ORA_ARCHIVE_STATE,该值为0和1,0表示数据是active,1表示数据是inactive的,插入数据时若不指定该列的值,则默认为0。
3 查看表结构
ALEN@PROD2> select column_name,data_type,data_length,column_id,segment_column_id, hidden_column from user_tab_cols where table_name='ALEN';
COLUMN_NAME DATA_TYPE DATA_LENGTH COLUMN_ID SEGMENT_COLUMN_ID HIDDEN_COL
------------------------------ -------------------- ----------- ---------- ----------------- ----------
ORA_ARCHIVE_STATE VARCHAR2 4000 1 YES
ID NUMBER 22 1 2 NO
NAME VARCHAR2 200 2 3 NO
4 创建并查看测试数据
ALEN@PROD2> insert into alen(id,name) values(2,'Lucy');
1 row created.
ALEN@PROD2> commit;
Commit complete.
ALEN@PROD2> select ora_archive_state,id,name from alen;
ORA_ARCHIVE_STATE ID NAME
-------------------- ---------- --------------------
0 1 Alen
0 2 Lucy
5 修改数据使其归档
ALEN@PROD2> update alen set ora_archive_state=2 where id=2;
1 row updated.
ALEN@PROD2> commit;
Commit complete.
ALEN@PROD2> select ora_archive_state,id,name from alen;
ORA_ARCHIVE_STATE ID NAME
-------------------- ---------- --------------------
0 1 Alen
可以看到,将隐藏列置为非0值后,该行记录就不可见了。
6 参数ROW ARCHIVAL VISIBILITY设置
在会话级别设置该参数,可实现对已归档数据行的可见性,该参数有两个值,分别为:
- ACTIVE:默认值,设置该参数后,执行查询时数据库返回active数据行;
- ALL:该值该参数后,执行查询时,数据库返回所有数据行;
6.1 设置参数值为ALL
ALEN@PROD2> select ora_archive_state,id,name from alen;
ORA_ARCHIVE_STATE ID NAME
-------------------- ---------- --------------------
0 1 Alen
2 2 Lucy
6.2 设置参数值为ACTIVE
ALEN@PROD2> insert into alen(ora_archive_state,id,name) values(1,3,'Tom');
1 row created.
ALEN@PROD2> commit;
Commit complete.
ALEN@PROD2> alter session set row archival visibility=active;
Session altered.
ALEN@PROD2> select ora_archive_state,id,name from alen;
ORA_ARCHIVE_STATE ID NAME
-------------------- ---------- --------------------
0 1 Alen
7 禁用行归档
ALEN@PROD2> alter table alen no row archival;
Table altered.
ALEN@PROD2> select * from alen;
ID NAME
---------- --------------------
1 Alen
2 Lucy
3 Tom
以上就是Oracle 12c新增特性行归档的使用,通过该特性的隐藏列ora_archive_state可实现数据的删除或归档。