这些inactive的数据行可以通过压缩进一部优化,且对应用来说默认不可见。? ? 可以通过一个session级别的参数来控制数据的可见与否。
通过In-Database Archiving数据库内归档特性可以在单库中存放更长周期的数据, 而损耗很少的应用性能。 归档数据还可以通过压缩来进一步提升备份效能。
要管理一张表的In-Database Archiving,必须为表启用ROW ARCHIVAL? 并操作ORA_ARCHIVE_STATE 这个隐藏字段 。 此外用户还可以指定session级别的 ROW ARCHIVAL VISIBILITY为ACTIVE? 或者ALL。
下面为演示示例:
/* Set visibility to ACTIVE to display only active rows of a table.*/
ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ACTIVE;
CREATE TABLE employees_indbarch
(employee_id NUMBER(6) NOT NULL,
first_name VARCHAR2(20), last_name VARCHAR2(25) NOT NULL,
email VARCHAR2(25) NOT NULL, phone_number VARCHAR2(20),
hire_date DATE NOT NULL, job_id VARCHAR2(10) NOT NULL, salary? NUMBER(8,2),
commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4)) ROW ARCHIVAL;
INSERT INTO employees_indbarch(employee_id, first_name, last_name, email,
hire_date, job_id, salary, manager_id, department_id)
'IT_PROG', 50000, 103, 60);
INSERT INTO employees_indbarch(employee_id, first_name, last_name, email,
hire_date, job_id, salary, manager_id, department_id)
'IT_PROG', 50000, 103, 60);
commit;
/* Show all the columns in the table, including hidden columns */
SELECT SUBSTR(COLUMN_NAME,1,22), SUBSTR(DATA_TYPE,1,20), COLUMN_ID AS COL_ID,
SEGMENT_COLUMN_ID AS SEG_COL_ID, INTERNAL_COLUMN_ID AS INT_COL_ID, HIDDEN_COLUMN, CHAR_LENGTH
FROM USER_TAB_COLS WHERE TABLE_NAME='EMPLOYEES_INDBARCH';
SELECT SUBSTR(COLUMN_NAME,1,22) NAME, SUBSTR(DATA_TYPE,1,20) DATA_TYPE, COLUMN_ID AS COL_ID,
SEGMENT_COLUMN_ID AS SEG_COL_ID, INTERNAL_COLUMN_ID AS INT_COL_ID, HIDDEN_COLUMN, CHAR_LENGTH
FROM USER_TAB_COLS WHERE TABLE_NAME='EMPLOYEES_INDBARCH';
NAME? ? ? ? ? ? ? ? ? DATA_TYPE? ? ? ? ? ? ? ? COL_ID SEG_COL_ID INT_COL_ID HID CHAR_LENGTH
---------------------- -------------------- ---------- ---------- ---------- --- -----------
ORA_ARCHIVE_STATE? ? ? VARCHAR2? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1? ? ? ? ? 1 YES? ? ? ? 4000
EMPLOYEE_ID? ? ? ? ? ? NUMBER? ? ? ? ? ? ? ? ? ? ? ? 1? ? ? ? ? 2? ? ? ? ? 2 NO? ? ? ? ? ? 0
FIRST_NAME? ? ? ? ? ? VARCHAR2? ? ? ? ? ? ? ? ? ? ? 2? ? ? ? ? 3? ? ? ? ? 3 NO? ? ? ? ? 20
LAST_NAME? ? ? ? ? ? ? VARCHAR2? ? ? ? ? ? ? ? ? ? ? 3? ? ? ? ? 4? ? ? ? ? 4 NO? ? ? ? ? 25
EMAIL? ? ? ? ? ? ? ? ? VARCHAR2? ? ? ? ? ? ? ? ? ? ? 4? ? ? ? ? 5? ? ? ? ? 5 NO? ? ? ? ? 25
PHONE_NUMBER? ? ? ? ? VARCHAR2? ? ? ? ? ? ? ? ? ? ? 5? ? ? ? ? 6? ? ? ? ? 6 NO? ? ? ? ? 20
HIRE_DATE? ? ? ? ? ? ? DATE? ? ? ? ? ? ? ? ? ? ? ? ? 6? ? ? ? ? 7? ? ? ? ? 7 NO? ? ? ? ? ? 0
JOB_ID? ? ? ? ? ? ? ? VARCHAR2? ? ? ? ? ? ? ? ? ? ? 7? ? ? ? ? 8? ? ? ? ? 8 NO? ? ? ? ? 10
SALARY? ? ? ? ? ? ? ? NUMBER? ? ? ? ? ? ? ? ? ? ? ? 8? ? ? ? ? 9? ? ? ? ? 9 NO? ? ? ? ? ? 0
COMMISSION_PCT? ? ? ? NUMBER? ? ? ? ? ? ? ? ? ? ? ? 9? ? ? ? 10? ? ? ? 10 NO? ? ? ? ? ? 0
MANAGER_ID? ? ? ? ? ? NUMBER? ? ? ? ? ? ? ? ? ? ? 10? ? ? ? 11? ? ? ? 11 NO? ? ? ? ? ? 0
DEPARTMENT_ID? ? ? ? ? NUMBER? ? ? ? ? ? ? ? ? ? ? 11? ? ? ? 12? ? ? ? 12 NO? ? ? ? ? ? 0
/* Decrease the ORA_ARCHIVE_STATE column size to improve formatting in queries */
COLUMN ORA_ARCHIVE_STATE FORMAT a18;
/* The default value for ORA_ARCHIVE_STATE is '0', which means active */
SELECT employee_id, ORA_ARCHIVE_STATE FROM employees_indbarch;
EMPLOYEE_ID ORA_ARCHIVE_STATE
----------- ------------------
? ? ? 251 0
? ? ? 252 0
/* Insert a value into ORA_ARCHIVE_STATE to set inactive */
UPDATE employees_indbarch SET ORA_ARCHIVE_STATE = '20' WHERE employee_id = 252;
/* Only active records are in the following query */
SELECT employee_id, ORA_ARCHIVE_STATE FROM employees_indbarch;
EMPLOYEE_ID ORA_ARCHIVE_STATE
----------- ------------------
? ? ? 251 0
/* Set visibility to ALL to display all records */
ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ALL;
SELECT employee_id, ORA_ARCHIVE_S