在上一期中已经看到SecureFile的优势,此次深度比较下和之前老版本的BasicFile比较,老版本的存量和未来的AI场景,有多大的差异需要实操见真章。
在Oracle数据库中,使用SecureFile LOB存储方式主要在以下场景中具有显著优势,这些场景基于其功能与性能优化设计:
一、需要高级存储功能的场景
- 数据压缩需求当LOB数据量庞大且需要节省存储空间时,SecureFile支持COMPRESS选项(需购买Advanced Compression选件付费的哦)。压缩等级可选择MEDIUM(默认)或HIGH,实测中压缩后空间占用可降至未压缩状态的数十分之一。
- 重复数据消除(Deduplication)若LOB数据存在高度重复(如存储大量相同模板文件),启用DEDUPLICATE功能可自动消除重复内容。例如,实验显示存储1000份相同CLOB时,SecureFile的重复消除使段空间从19MB降至256KB。
- 数据加密要求对敏感LOB数据(如医疗影像、合同文档),SecureFile支持透明加密(需Advanced Security选件),确保数据在存储和传输中的安全性。
二、追求高性能与高并发的场景
- OLTP高并发写入SecureFile针对高并发DML操作优化,解决了BasicFile在RAC环境中扩展性差的问题。适合频繁更新LOB列的业务系统(如实时文档协作平台)。
- 大文件高效读写通过动态调整CHUNK大小、减少碎片,SecureFile提升了大文件(如视频、图像)的I/O效率,读写吞吐量显著高于BasicFile。
三、简化管理与兼容性场景
- 自动化参数管理SecureFile无需手动设置CHUNK、FREELISTS、PCTVERSION等参数,降低了管理复杂度,适合快速部署。
- 新版本兼容性从Oracle 12c开始,ASSM表空间中的LOB列默认创建为SecureFile。Oracle官方明确建议优先使用SecureFile,因BasicFile未来版本可能不再支持。
四、使用前提与限制
- 表空间要求SecureFile必须存储在ASSM(自动段空间管理)表空间中,否则创建报错(如ORA-43853)
- 参数配置
- 初始化参数DB_SECUREFILE需设置为PERMITTED(默认)或FORCE/ALWAYS。
- 数据库兼容性参数COMPATIBLE需≥11.0.0。
- 功能许可:压缩和加密需额外购买Advanced Compression和Advanced Security选件。
五、迁移建议
- 检查现有LOB类型:
-- 识别BasicFile
SELECT table_name, securefile FROM dba_lobs WHERE securefile = 'NO';
--
已连接到:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SYS@CDB$ROOT> alter session set container =PDBRS6;
Session已变更。
SYS@CDB$ROOT> SELECT table_name, securefile FROM dba_lobs WHERE securefile = 'NO';
TABLE_NAME SEC
-------------------------------------------------------------------------------------------------------------------------------- ---
EDITION$ NO
VIEWCON$ NO
ECOL$ NO
PDB_SYNC$ NO
PDB_SYNC_STMT$ NO
LOCKDOWN_PROF$ NO
PDB_CREATE$ NO
…………
已选择 295 行。
SYS@CDB$ROOT>
- 在线迁移:使用ALTER TABLE ... MOVE LOB(...) STORE AS SECUREFILE语句转换。
-- 在线迁移
ALTER TABLE test_basicfile MOVE
LOB(image_data) STORE AS SECUREFILE (
TABLESPACE SECURE_LOB_TS
COMPRESS HIGH
DEDUPLICATE
);
六、聚焦医疗影像(BLOB)与电子病历(CLOB/JSON)的场景:
6.1、测试环境配置
1. 必备条件
类型 |
Oracle 11g |
Oracle 19c/23ai |
表空间类型 |
ASSM表空间 |
ASSM表空间(23ai默认BIGFILE) |
参数设置 |
DB_SECUREFILE=FORCE |
DB_SECUREFILE=PERMITTED(默认) |
兼容性参数 |
COMPATIBLE≥11.0.0 |
COMPATIBLE≥19.0.0(23ai需≥23.0) |
选件要求 |
压缩/加密需Advanced Compression/Security选件 |
23ai Free包含基础压缩-高级同样需要许可 |
6.2、实操脚本
1. 医疗影像表(BLOB存储)
create tablespace assm_ts
DATAFILE 'assm_ts.dbf' size 100M
autoextend ON SEGMENT SPACE MANAGEMENT AUTO;
--Tablespace ASSM_TS created.
-- 11g/19c/23ai通用创建脚本
CREATE TABLE medical_images2 (
image_id NUMBER PRIMARY KEY,
patient_id VARCHAR2(20),
scan_date DATE,
dicom_data BLOB
) LOB(dicom_data) STORE AS SECUREFILE (
COMPRESS HIGH -- 启用高级压缩
DEDUPLICATE -- 启用重复数据消除
NOCACHE -- 避免缓存大文件
) TABLESPACE assm_ts;
--Table MEDICAL_IMAGES2 created.
2. 电子病历表(CLOB/JSON存储)
-- 11g/19c使用CLOB
CREATE TABLE patient_records (
record_id NUMBER,
patient_info CLOB
) LOB(patient_info) STORE AS SECUREFILE (COMPRESS MEDIUM) TABLESPACE assm_ts;
--Table PATIENT_RECORDS created.
-- 23ai使用JSON类型(原生支持)
CREATE TABLE patient_records_23ai (
record_id NUMBER PRIMARY KEY,
patient_info BLOB -- 使用 BLOB 类型存储 JSON 二进制数据
)
LOB(patient_info) STORE AS SECUREFILE ( -- 正确引用 BLOB 列
COMPRESS HIGH -- 启用高压缩
ENABLE STORAGE IN ROW -- 优化小 JSON 读取
)
TABLESPACE assm_ts; -- 确保 assm_ts 是 ASSM 表空间
--Table PATIENT_RECORDS_23AI created.
-- 添加约束确保 BLOB 内容为合法 JSON
ALTER TABLE patient_records_23ai
ADD CONSTRAINT check_json CHECK (
patient_info IS JSON FORMAT JSON STRICT
);
--Table PATIENT_RECORDS_23AI altered.
--(可选,可不设置)
3. 性能测试脚本(写入)
-- 模拟影像数据插入(10万条)
DECLARE
l_blob BLOB;
BEGIN
FOR i IN 1..100000 LOOP
INSERT INTO medical_images2 VALUES (
i,
'PAT'||i,
SYSDATE,
EMPTY_BLOB()
) RETURNING dicom_data INTO l_blob;
-- 生成模拟DICOM数据(1MB随机二进制)
DBMS_LOB.WRITE(l_blob, DBMS_LOB.GETLENGTH(l_blob), 1, UTL_RAW.CAST_TO_RAW(DBMS_RANDOM.STRING('X', 1048576)));
END LOOP;
COMMIT;
END;
/
4. 查看压缩
-- 查看LOB段空间占用(通用)
SELECT
l.owner,
l.table_name,
s.segment_name,
s.bytes / 1024 / 1024 AS size_mb
FROM dba_segments s
JOIN dba_lobs l
ON s.segment_name = l.segment_name
AND s.owner = l.owner
WHERE l.table_name = 'MEDICAL_IMAGES2';
--
OWNER TABLE_NAME SEGMENT_NAME SIZE_MB
________ __________________ ____________________________ __________
SYS MEDICAL_IMAGES2 SYS_LOB0000073328C00004$$ 0.25
Elapsed: 00:00:01.166
--
SELECT table_name, securefile, compression
2 FROM dba_lobs
3* WHERE table_name = 'PATIENT_RECORDS_23AI';
--
TABLE_NAME SECUREFILE COMPRESSION
_______________________ _____________ ______________
PATIENT_RECORDS_23AI YES HIGH
6.3、避坑指南
- 迁移注意
-- 检查BasicFile并转换
SELECT table_name FROM user_lobs WHERE securefile = 'NO';
ALTER TABLE medical_images MOVE LOB(dicom_data) STORE AS SECUREFILE;
- 23ai专属优化
- 启用BIGFILE表空间减少文件头开销
- 使用COMPRESSION
- 必备参数
-- 错误:非ASSM表空间创建报ORA-43853
CREATE TABLESPACE basic_ts DATAFILE ... SEGMENT SPACE MANAGEMENT MANUAL;
ORA-43853: SecureFiles LOBs (Large Objects)
cannot be used in non-automatic segment space management tablespace
实操可验证各版本SecureFiles在医疗数据场景的优化效果,建议优先部署23ai以获得最佳存储效率与增强特性,针对未来AI场景的有力支持。