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命令进行重新设置。
1