LOB压缩
SecureFile的COMPRESS选项在表或分区一级上开启了对LOB内容的压缩,使用关键字MEDIUM和HIGH表示压缩的等级,如果没 有指定压缩等级,就默认为MEDIUM,对LOB内容进行压缩会增加系统开销,因此使用高等级的压缩可能会对系统性能产生不良影响,SecureFile LOB的压缩功能不影响表压缩,反之亦然,下面的例子对比了使用普通的SecureFile LOB和启用压缩功能的SecureFile LOB的空间利用情况。
CREATE TABLE nocompress_tab (
id NUMBER,
clob_data CLOB
)
LOB(clob_data) STORE AS SECUREFILE nocompress_lob(
NOCOMPRESS
);
CREATE TABLE compress_tab (
id NUMBER,
clob_data CLOB
)
LOB(clob_data) STORE AS SECUREFILE compress_lob (
COMPRESS HIGH
);
DECLARE
l_clob CLOB := RPAD('X', 10000, 'X');
BEGIN
FOR i IN 1 .. 1000 LOOP
INSERT INTO nocompress_tab VALUES (i, l_clob);
END LOOP;
COMMIT;
FOR i IN 1 .. 1000 LOOP
INSERT INTO compress_tab VALUES (i, l_clob);
END LOOP;
COMMIT;
END;
/
EXEC DBMS_STATS.gather_table_stats(USER, 'nocompress_tab');
EXEC DBMS_STATS.gather_table_stats(USER, 'compress_tab');
COLUMN segment_name FORMAT A30
SELECT segment_name, bytes
FROM user_segments
WHERE segment_name IN ('COMPRESS_LOB', 'NOCOMPRESS_LOB');
SEGMENT_NAME BYTES
------------------------------ ----------
COMPRESS_LOB 131072
NOCOMPRESS_LOB 71565312
2 rows selected.
SQL>
我们可以看到压缩的LOB段比没有压缩的LOB段明显要小得多,空间节约的程度依赖于LOB段数据的存储类型。
可以使用ALTER TABLE命令重新设置压缩模式。
ALTER TABLE compress_tab MODIFY LOB(clob_data) (
NOCOMPRESS
);
EXEC DBMS_STATS.gather_table_stats(USER, 'compress_tab');
COLUMN segment_name FORMAT A30
SELECT segment_name, bytes
FROM user_segments
WHERE segment_name IN ('COMPRESS_LOB', 'NOCOMPRESS_LOB');
SEGMENT_NAME BYTES
------------------------------ ----------
COMPRESS_LOB 76808192
NOCOMPRESS_LOB 71630848
2 rows selected.
SQL>
LOB加密
SecureFile LOB的加密功能依赖于钱夹或硬件安全模型(HSM)掌管加密密钥,钱夹设置与透明数据加密(TDE)和表空间加密描述的一样,因此在尝试下面的例子前先完成那两个实验。
SecureFile的ENCRYPT选项执行块级别的LOB内容加密,一个可选的USING子句定义了使用哪种加密算法(3DES168, AES128, AES192, 或AES256),默认使用AES192算法,NO SALT选项对于SecureFile加密不可用,加密是应用在每一列上的,因此它会影响所有使用LOB的分区,DECRPT选项用于明确地阻止加密,下 面的例子显示了使用加密的SecureFile LOB数据类型创建表。
CREATE TABLE encrypt_tab (
id NUMBER,
clob_data CLOB
)
LOB(clob_data) STORE AS SECUREFILE encrypt_lob(
ENCRYPT USING 'AES256'
);
ALTER TABLE命令可以用于加密或解密现有的列,要切换加密算法你必须使用REKEY选项。
ALTER TABLE encrypt_tab MODIFY (
clob_data CLOB DECRYPT
);
ALTER TABLE encrypt_tab MODIFY (
clob_data CLOB ENCRYPT USING '3DES168'
);
ALTER TABLE encrypt_tab REKEY USING 'AES192';
加密是不受原来的导入导出工具或表空间传输支持的,因此必须使用数据泵导入导出工具来传输数据。