Oracle SecureFile的功能第1/4页
初始化参数
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命令进行重新设置。