SecureFile功能是oracle 11g中對大對象(LOB)儲存格式的完全重新設計實現,原來的LOB儲存格式現在通稱為BASIXFILE,它仍然是預設的儲存方法,但是SECURFILE關鍵字開啟了新的儲存方法,它允許加密、利用壓縮節約空間和資料重複消除。
初始化參數
SecureFile功能在初始化參數COMPATIBLE設定我11.0.0.0.0或更高時可用。
DB_SECUREFILE初始化參數控制資料庫對LOB儲存格式的預設行為,允許的值有:
◆ALWAYS - 在ASSM資料表空間中的所有LOB對象以SecureFile LOB的格式建立,在非ASSM資料表空間中的所有LOB對象以BasicFile LOB的格式建立(除非明確地指出要以SecureFile格式建立),在沒有指定選項的情況下,BasicFile儲存格式選項被忽略,SecureFile預設儲存格式選項被使用。
◆ FORCE - 所有LOB對象都以SecureFile LOB格式建立,如果是在一個非ASSM資料表空間中建立LOB,會出現錯誤,在沒有指定選項的情況下,BasicFile儲存格式選項被忽略,SecureFile預設儲存格式選項被使用。
◆PERMITTED - 預設設定,當使用了SECUREFILE關鍵字時它允許SecureFile LOB儲存格式,預設儲存方法是BASICFILE。
◆NEVER - 不允許建立SecureFile LOB對象。
◆IGNORE - 防止建立SecureFile LOB,使用SecureFile儲存選項時忽略所有錯誤。
這個參數是動態,因此它可以使用ALTER SYSTEM命令設定。
SQL> ALTER SYSTEM SET db_securefile = 'FORCE'; System altered. SQL> ALTER SYSTEM SET db_securefile = 'PERMITTED'; System altered. SQL> |
下面的例子假設DB_SECUREFILE初始化參數設定為預設值PERMITTED。
建立SecureFile LOB
基礎
SecureFile LOB通過在LOB儲存子句後添加SECUREFILE關鍵字來建立,下面的代碼顯示建立了兩個表,第一個使用的是原來的儲存格式,第二個使用的是SecureFile儲存格式。
CREATE TABLE bf_tab ( id NUMBER, clob_data CLOB ) LOB(clob_data) STORE AS BASICFILE; INSERT INTO bf_tab VALUES (1, 'My CLOB data'); COMMIT; CREATE TABLE sf_tab ( id NUMBER, clob_data CLOB ) LOB(clob_data) STORE AS SECUREFILE; INSERT INTO sf_tab VALUES (1, 'My CLOB data'); COMMIT; |
LOB重複消除
SecureFile的DEDUPLICATE選項允許在表或分區一級上的一個LOB內消除重複資料,正如你預料的那樣,這個技術與預防重寫導致系統開銷增大,KEEP_DUPLICATE選項明確地阻止重複消除,下面的例子對比了普通的SecureFile和重複消除SecureFile的空間使用方式。
CREATE TABLE keep_duplicates_tab ( id NUMBER, clob_data CLOB ) LOB(clob_data) STORE AS SECUREFILE keepdup_lob( KEEP_DUPLICATES ); CREATE TABLE deduplicate_tab ( id NUMBER, clob_data CLOB ) LOB(clob_data) STORE AS SECUREFILE dedup_lob ( DEDUPLICATE ); DECLARE l_clob CLOB := RPAD('X', 10000, 'X'); BEGIN FOR i IN 1 .. 1000 LOOP INSERT INTO keep_duplicates_tab VALUES (i, l_clob); END LOOP; COMMIT; FOR i IN 1 .. 1000 LOOP INSERT INTO deduplicate_tab VALUES (i, l_clob); END LOOP; COMMIT; END; / EXEC DBMS_STATS.gather_table_stats(USER, 'keep_duplicates_tab'); EXEC DBMS_STATS.gather_table_stats(USER, 'deduplicate_tab'); COLUMN segment_name FORMAT A30 SELECT segment_name, bytes FROM user_segments WHERE segment_name IN ('KEEPDUP_LOB', 'DEDUP_LOB'); SEGMENT_NAME BYTES ------------------------------ ---------- DEDUP_LOB 262144 KEEPDUP_LOB 19267584 2 rows selected. SQL> |
注意重複消除段要小很多,空間節約依賴於LOB段內的重複程度,重複模式可以使用ALTER TABLE命令進行重新設定。