前言:從檔案系統到資料庫的多媒體演進
傳統多媒體 (圖片、音訊、視訊、文檔) 以檔案形式儲存於 OS,透過路徑引用。隨著交易一致性、安全存取控制、備份恢復、內容檢索、元資料管理需求爆發,多媒體資料入庫 成為必然。Oracle 8i 引入 LOB (Large Object) 標準,9i/10g 推出 Oracle Multimedia (原 interMedia) 內建影像/音訊/視訊處理、11g+ 增強 SecureFiles、12c+ 整合 JSON/XML 文檔儲存。本文系統剖析 LOB 型別、儲存機制、Oracle Multimedia 能力、效能調優與雲端遷移路徑。
LOB 型別全景圖
| 型別 | 對應舊型別 | 儲存內容 | 字元集 | 最大長度 | 典型用途 |
| CLOB | LONG | 單位元組字元資料 (文本、XML、JSON、原始碼) | 資料庫字符集 | (4GB-1) * DB_BLOCK_SIZE | 大文本、日誌、文章、原始碼 |
| NCLOB | — | 固定寬度多位元組字元資料 (Unicode 文本) | 國家字符集 (AL16UTF16) | 同 CLOB | 多語言文本、國際化內容 |
| BLOB | LONG RAW | 二進位資料 (圖片、音訊、視訊、PDF、Office、加密資料) | 無 (二進位) | 同 CLOB | 所有二進位媒體、二進位序列化 |
| BFILE | — | 外部檔案系統二進位檔案 (唯讀、資料庫外部) | 無 | OS 檔案大小限制 | 超大媒體、唯讀歸檔、混合儲存 |
LOB 儲存機制:SecureFiles (11g+) vs BasicFiles
| 特性 | BasicFiles (傳統) | SecureFiles (11g+ 預設) |
| 儲存格式 | 區塊連結列表 | 先進資料結構、類似檔案系統 |
| 重複資料刪除 | ❌ | ✅ DEDUPLICATE (塊級去重) |
| 壓縮 | ❌ | ✅ COMPRESS LOW/MEDIUM/HIGH |
| 加密 | ❌ (需 TDE 表空間加密) | ✅ ENCRYPT (欄級、AES128/192/256) |
| 快照/克隆 | ❌ | ✅ DBMS_LOB.CREATE_TEMPORARY 快速克隆 |
| 並行讀寫 | 受限 | ✅ 多執行緒流式存取 |
| 效能 | 基準 | 讀寫提升 2-10x、空間節省 30-90% |
| 指定方式 | STORE AS BASICFILE | STORE AS SECUREFILE (預設) |
-- 建表指定 SecureFiles 完整選項
CREATE TABLE multimedia_docs (
id NUMBER PRIMARY KEY,
doc_name VARCHAR2(200),
doc_content BLOB
) LOB (doc_content) STORE AS SECUREFILE (
TABLESPACE users
ENABLE STORAGE IN ROW -- 小於 4KB 存行內
CHUNK 8192 -- 讀寫區塊大小 (8KB)
RETENTION -- 保留舊版本供一致性讀
CACHE -- 緩衝區快取
COMPRESS MEDIUM -- 壓縮
DEDUPLICATE -- 去重
ENCRYPT USING 'AES256' -- 加密
);
Oracle Multimedia (interMedia) 核心能力
物件型別:ORDImage, ORDAudio, ORDVideo, ORDDoc (異構文檔)、ORDDicom (醫療影像 DICOM)。
| 能力 | ORDImage | ORDAudio | ORDVideo | ORDDoc |
| 格式識別 | ✅ 100+ 格式 (JPEG, PNG, TIFF, BMP, GIF, WebP...) | ✅ MP3, WAV, AAC, FLAC... | ✅ MP4, AVI, MOV, MKV... | ✅ PDF, Office, HTML, XML... |
| 元資料提取 | EXIF, IPTC, XMP, 地理標記 | ID3 Tag, 持續時間、位元率 | 容器資訊、編解碼器、解析度 | 作者、建立時間、頁數、關鍵字 |
| 內容處理 | 縮圖、裁剪、旋轉、格式轉換、水印、銳化 | 格式轉換、片段擷取、音量調整 | 格式轉換、關鍵幀擷取、預覽圖 | 文檔轉文本、縮圖、頁面擷取 |
| 內容檢索 | 顏色直方圖、紋理、形狀、平均顏色 (內容基礎檢索) | — | — | — |
| SQL 整合 | IMG.thumbnail(), IMG.process('scale=0.5') | AUD.getDuration() | VID.getFrame(10) | DOC.getContentLength() |
-- 範例: 影像上傳、縮圖生成、元資料提取
DECLARE
v_img ORDImage;
BEGIN
INSERT INTO image_archive (id, name, image_obj)
VALUES (1, 'photo.jpg', ORDImage.init())
RETURNING image_obj INTO v_img;
-- 從 BFILE 載入 (OS 檔案)
v_img.importFrom(ctx, 'FILE', 'MEDIA_DIR', 'photo.jpg');
-- 自動提取元資料 (EXIF, XMP)
v_img.setProperties();
-- 生成縮圖 (200x200)
v_img.process('thumbnail=200,200');
-- 更新資料庫
UPDATE image_archive SET image_obj = v_img WHERE id = 1;
COMMIT;
END;
/
LOB 操作介面:PL/SQL (DBMS_LOB) vs OCI/JDBC
| 操作 | PL/SQL (DBMS_LOB) | JDBC (oracle.sql.BLOB/CLOB) | OCI (OCILob*) |
| 讀取 | DBMS_LOB.READ | blob.getBinaryStream() | OCILobRead2 |
| 寫入 | DBMS_LOB.WRITE, WRITEAPPEND | blob.setBinaryStream() | OCILobWrite2 |
| 複製 | DBMS_LOB.COPY | blob.position() + Stream | OCILobCopy2 |
| 擷取子集 | DBMS_LOB.SUBSTR | blob.getBytes() | OCILobRead2 (offset/amount) |
| 長度 | DBMS_LOB.GETLENGTH | blob.length() | OCILobGetLength2 |
| 暫時 LOB | DBMS_LOB.CREATETEMPORARY | Connection.createBlob() | OCILobCreateTemporary |
| 流式存取 (11g+) | DBMS_LOB.OPEN/CLOSE (模式) | blob.setBinaryStream(1) (流) | OCILobOpen/Close |
最佳實務:應用層優先使用 流式 API (JDBC Stream / OCI Lob Stream),避免大物質化於記憶體;PL/SQL 批次處理用 DBMS_LOB;ENABLE STORAGE IN ROW 讓小 LOB (< 4KB) 直接存行內,省去額外查找。
效能調優:LOB 專項優化清單
- 啟用 SecureFiles:預設即開,確認
DB_SECUREFILE = PERMITTED/PREFERRED/ALWAYS。
- CHUNK 大小對齊:
CHUNK 8192 (8KB) 匹配資料庫區塊大小,減少讀取放大。
- CACHE vs NOCACHE:頻繁讀取的 LOB (縮圖、熱門文檔) 設
CACHE;一次性寫入/歸檔設 NOCACHE 避免污染 Buffer Cache。
- PCTVERSION / RETENTION:高併發更新 LOB 設
RETENTION (Undo 保留) 而非 PCTVERSION,避免 Snapshot Too Old。
- 索引策略:LOB 欄位不可建標準索引。Oracle Text (Context 索引) 針對 CLOB 全文檢索;函數式索引 針對元資料欄位 (如
IMG.getWidth())。
- 並行 DML:大量 LOB 載入
ALTER SESSION ENABLE PARALLEL DML + INSERT /*+ PARALLEL(8) */。
- Temp 表空間:大量 LOB 操作 (轉換、複製) 產生大量暫時 LOB,確保 Temp 表空間充足、
TEMP_UNDO_ENABLED=TRUE (12c+)。
遷移與現代化:從檔案系統/舊 LOB 到 SecureFiles + 雲端
| 來源 | 目標 | 遷移工具/方法 | 關鍵步驟 |
| OS 檔案系統 (路徑存資料庫) | BLOB SecureFiles | SQL*Loader (LOBFILE)、外部表 + PL/SQL 批次、Data Pump + PL/SQL | 1) 建立目標表 SecureFiles 2) 並行載入 3) 驗證 MD5 4) 切換應用 |
| BasicFiles LOB | SecureFiles | ALTER TABLE ... MOVE LOB(col) STORE AS SECUREFILE ... (Online, 12.2+) | 1) 評估空間節省 2) 維護窗口線上移動 3) 重建索引/統計 |
| Oracle Multimedia 物件型別 | 標準 BLOB + 應用層處理 | 應用重寫、微服務化 (ImageMagick, FFmpeg, Tika, OpenCV) | 1) 提取元資料存獨立欄 2) 處理邏輯下沉應用層 3) 資料庫僅存 BLOB |
| 自建資料庫 | Oracle Cloud (Autonomous Database / Object Storage) | Data Pump、Zero Downtime Migration (ZDM)、Oracle Cloud Infrastructure CLI | 1) 評估相容性 2) ZDM 零停機遷移 3) Object Storage 存靜態媒體 + CDN |
總結
Oracle 多媒體管理已從「單純存二進位」演進為「SecureFiles 高效儲存 + Oracle Multimedia 智能處理 + Oracle Text 全文檢索 + 雲端原生儲存」的完整生態。核心決策:啟用 SecureFiles (壓縮/去重/加密)、CHUNK 對齊、CACHE 策略、流式讀寫、Oracle Text 索引。現代架構傾向 資料庫存熱門/結構化/需交易一致性的媒體元資料與小媒體、Object Storage 存海量冷/靜態媒體 + CDN 分發,資料庫與物件儲存協同,實現成本與效能最優平衡。