小伙伴们在日常的操作中,使用LOB对象会很多么,工业的附件、医疗的图像、电子病历的长长的几千上万字的描述和图像等,这些在查询和使用过程中都是极度折磨,第一速度慢、第二是占用超大空间,且业务需要从这些字段中拆解信息,统计、上传等。
Oracle的大对象(LOB)存储技术经历了从BasicFile到SecureFile的革新,在23 ai默认用SecureFile带来性能与智能管理的提升。
一、LOB技术原理与架构解析
LOB(Large Object) 是Oracle处理大文件(如图片、视频、文档)的核心数据类型,分为:
- BLOB:二进制数据(如图像)
- CLOB:字符数据(如日志文件)
- NCLOB:Unicode字符数据
- BFILE:指向外部文件的指针
存储架构核心机制
- 行内/行外存储
- 小LOB(≤4000B)直接存储在表行中
- 大LOB使用“LOB定位器”指向外部LOB段
- 分块存储(Chunking)
- LOB数据被拆分为多个块(Chunk)
- 每个Chunk包含Header(元数据)和Body(实际数据)
- 大块(如32KB)减少I/O操作,提升大文件读写效率
- LOB索引机制
- SYS_LOB$$对象管理LOB块的物理地址
- 索引结构优化大文件随机访问性能
实践脚本:创建含LOB列的表
SYS@CDB$ROOT>
create tablespace SECURE_LOB_TS
DATAFILE 'SECURE_LOB_TS.dbf' size 100M
autoextend ON SEGMENT SPACE MANAGEMENT AUTO;
--Tablespace SECURE_LOB_TS created.
CREATE TABLE medical_images (
image_id NUMBER PRIMARY KEY,
description VARCHAR2(100),
image_data BLOB
) LOB(image_data) STORE AS SECUREFILE (
TABLESPACE SECURE_LOB_TS
COMPRESS HIGH
DEDUPLICATE
);
--Table MEDICAL_IMAGES created.
二、SecureFile 在LOB上的提升
自11g引入的SecureFile彻底重构了LOB存储,19c可以选择是否SecureFile,23 ai 默认SecureFile,有了这个支持才有了向量数据存入lob字段,存储体验SecureFile的速度和性能。
关键技术特性
特性 |
BasicFile |
SecureFile |
23ai 增强 |
压缩 |
不支持 |
支持(HIGH/MEDIUM/LOW) |
自适应压缩等级选择 |
重复数据删除 |
不支持 |
表/分区级去重 |
跨分区去重 |
加密 |
需要额外工具 |
原生透明加密 |
整合Oracle Key Vault |
性能 |
较低 |
读写速度提升5-8倍 |
向量化AI加速扫描 |
脚本实测(23 ai环境)
-- 测试SecureFile与BasicFile读性能
ALTER SESSION SET db_securefile = 'FORCE';
--Session altered.
CREATE TABLE medical_images (
image_id NUMBER PRIMARY KEY,
description VARCHAR2(100),
image_data BLOB
) LOB(image_data) STORE AS SECUREFILE (
TABLESPACE SECURE_LOB_TS
COMPRESS HIGH
DEDUPLICATE
);
--Table MEDICAL_IMAGES created.
CREATE TABLE test_basicfile (id NUMBER, data BLOB)
LOB(data) STORE AS BASICFILE;
CREATE TABLE test_basicfile (
image_id NUMBER PRIMARY KEY,
description VARCHAR2(100),
image_data BLOB
) LOB(image_data) STORE AS basicfile (
TABLESPACE SECURE_LOB_TS
);
--Table TEST_BASICFILE created.
--SecureFile启用HIGH压缩和去重
-- 查询表空间的空间管理方式
SELECT tablespace_name, segment_space_management
FROM dba_tablespaces
WHERE tablespace_name = 'SECURE_LOB_TS';
-- 查询LOB的存储属性
ALTER TABLE medical_images ALLOCATE EXTENT;
ALTER TABLE test_basicfile ALLOCATE EXTENT;
--
SELECT table_name, securefile, compression, deduplication
FROM dba_lobs WHERE table_name='MEDICAL_IMAGES';
--
TABLE_NAME SECUREFILE COMPRESSION DEDUPLICATION
_________________ _____________ ______________ ________________
MEDICAL_IMAGES YES HIGH LOB
--
SELECT table_name, securefile, compression, deduplication
FROM dba_lobs WHERE table_name='TEST_BASICFILE';
--
TABLE_NAME SECUREFILE COMPRESSION DEDUPLICATION
__________________ _____________ ______________ ________________
TEST_BASICFILE YES NO NO
三、典型应用场景与优化实践
场景1:医疗PACS系统(BLOB存储)
- 需求:高压缩比保存CT影像,支持快速调阅
- 建表:
CREATE TABLE ct_scans (
scan_id NUMBER,
patient_id NUMBER,
scan_data BLOB
) LOB(scan_data) STORE AS SECUREFILE (
TABLESPACE SECURE_LOB_TS
COMPRESS HIGH
DEDUPLICATE
);
场景2:文档管理(CLOB去重)
- 现状:重复文档版本占用空间
- 优化:
CREATE TABLE contracts (
contract_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
contract_name VARCHAR2(100),
sign_date DATE DEFAULT SYSDATE,
contract_text CLOB
)
LOB(contract_text) STORE AS SECUREFILE ( -- 启用SecureFile特性
TABLESPACE SECURE_LOB_TS
COMPRESS HIGH -- 启用高压缩
DEDUPLICATE -- 启用去重(初始状态)
CACHE -- 缓存高频访问数据
);
--Table CONTRACTS created.
-- 测试:插入10,000份相似合同
DECLARE
base_text CLOB := '本合同由甲方...(此处为1KB基础合同模板)';
BEGIN
FOR i IN 1..10000 LOOP
INSERT INTO contracts (contract_name, contract_text)
VALUES (
'CONTRACT_' || i,
base_text || CHR(10) || '附加条款: ' || DBMS_RANDOM.STRING('X', 10) -- 添加随机差异
);
END LOOP;
COMMIT;
END;
/
--PL/SQL procedure successfully completed.
-- 查看实际空间占用
SELECT
segment_name,
ROUND(bytes/1024/1024, 2) AS size_mb
FROM user_segments
WHERE segment_name IN (
SELECT segment_name
FROM user_lobs
WHERE table_name = 'CONTRACTS'
);
--
SEGMENT_NAME SIZE_MB
____________________________ __________
SYS_LOB0000073323C00004$$ 0.25
--
-- 对比去重开关状态的空间差异
ALTER TABLE contracts MODIFY LOB(contract_text) (KEEP_DUPLICATES); -- 关闭去重
ALTER TABLE contracts MODIFY LOB(contract_text) (DEDUPLICATE); -- 启用去重
四、迁移与维护实战指南
BasicFile → SecureFile迁移
-- 在线迁移
ALTER TABLE test_basicfile MOVE
LOB(image_data) STORE AS SECUREFILE (
TABLESPACE SECURE_LOB_TS
COMPRESS HIGH
DEDUPLICATE
);
--Table TEST_BASICFILE altered.
-- 监控进度
SELECT table_name, securefile, compression, deduplication
FROM dba_lobs WHERE table_name='TEST_BASICFILE';
TABLE_NAME SECUREFILE COMPRESSION DEDUPLICATION
_________________ _____________ ______________ ________________
TEST_BASICFILE YES HIGH LOB
维护操作
- 空间回收
-- 在线启用去重-无需重建表去重
ALTER TABLE contracts MODIFY LOB(contract_text) (
DEDUPLICATE);
--Table CONTRACTS altered.
-- 确认LOB类型为SecureFile
SELECT table_name, securefile
FROM dba_lobs
WHERE table_name = 'CONTRACTS'; -- 应返回"YES"
--
TABLE_NAME SECUREFILE
_____________ _____________
CONTRACTS YES
-- 检查去重状态
SELECT deduplication
FROM dba_lobs
WHERE table_name = 'CONTRACTS';
--
DEDUPLICATION
________________
LOB
统计信息收集
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SYS',
tabname => 'MEDICAL_IMAGES',
method_opt => 'FOR COLUMNS image_data SIZE AUTO');
--
PL/SQL procedure successfully completed.
五、总结与最佳实践建议
Oracle 23 ai的SecureFile LOB成为大文件存储首选:
- 存储效率革命:压缩与去重降低70%+空间占用
- 性能飞跃:读写速度提升5-8倍
- 向量保存:兼容未来AI场景
实施建议:
- 新系统:直接使用SecureFile + 分区 + 去重
- 迁移系统:在线迁移结合AI压缩等级推荐
- AI场景:优先使用向量化LOB元数据加速分析
- 避坑指南:避免跨DB链接的LOB操作;NOCACHE适用于归档数据
最终的演进方向已经很清晰:SecureFile已成为非结构化数据管理的技术基石,而23 ai的AI集成正在重新定义LOB的智能管理范式。