2014年8月25日 星期一

Oracle 12c - Row-Archival



現在12C 有個新功能 In-Database Archiving 它允許在Row 上標記為不活躍的狀態,在進行操作時Oracle能自動略過不活躍的ROW,功能可以在session上個別控制


以下進行簡單的測試



--先建立測試的Table


SQL> create table row_archive_Test as select * from dba_objects;

已建立表格.

SQL> insert into row_archive_test select * from dba_objects;

已建立 90980 個資料列.

SQL> /

已建立 90980 個資料列.

SQL> /

已建立 90980 個資料列.

.......


--full table scan 看一下執行計畫如何




--把Table的標記功能開啟



SQL> alter table row_archive_test row archival;

已更改表格.

SQL>

--可以看到Table多了兩個隱藏的欄位, 其中ORA_ARCHIVE_STATE欄位,預設是0, 在官方的解釋裡只要設大於0表示是不活躍的資料

SQL>  SELECT COLUMN_NAME,DATA_TYPE,HIDDEN_COLUMN FROM DBA_TAB_COLS WHERE TABLE_N
AME='ROW_ARCHIVE_TEST';

COLUMN_NAME                    DATA_TYPE            HID
-------------------------     ------------------    -------
SYS_NC00019$                   RAW                   YES
ORA_ARCHIVE_STATE              VARCHAR2              YES
ORACLE_MAINTAINED              VARCHAR2              NO
EDITIONABLE                    VARCHAR2              NO
SHARING                        VARCHAR2              NO
EDITION_NAME                   VARCHAR2              NO
NAMESPACE                      NUMBER                NO


--在Session開啟功能


SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ACTIVE;

已更改階段作業.

SQL>


此參數有兩個值一個是ALL 表示顯示出所有資料, 另外一個是ACTIVE 表示遮蔽不活躍的資料



--把資料進行標記為不活躍, 這邊全標記1


SQL>  UPDATE ROW_ARCHIVE_TEST SET ORA_ARCHIVE_STATE = '1' WHERE OWNER = 'SYS';

已更新 418150 個資料列.

SQL> COMMIT;

確認完成.


SQL>


--full table scan 看一下執行計畫如何



可以看到不活躍的資料都不被顯示出來


--更改參數為 ALL ,資料又可以全部看到

SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ALL;

已更改階段作業.

SQL> select count(*) from ROW_ARCHIVE_TEST;

  COUNT(*)
----------
    908880




延伸閱讀


看到測試中的執行計畫可以發現,原來Oracle是利用ORA_ARCHIVE_STATE欄位進行篩選


那我們利用此欄位來讓 full table scan 的操作效能提升



--建立 bitmap index (因為只有1,0 建bitmap最適合)

SQL>  CREATE BITMAP INDEX index_row ON ROW_ARCHIVE_TEST(ORA_ARCHIVE_STATE);

已建立索引.

目前歷時: 00:00:01.32
SQL>


--full table scan 看一下執行計畫如何



這邊可以看到效能大幅的提升, 不過也僅止於 full table scan及某些特定的狀況下











沒有留言:

張貼留言