現在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及某些特定的狀況下
沒有留言:
張貼留言