首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 7 vs 8/8i/9i 大對象 (LOB) 演進全解析:從 LONG 到 SecureFile

     編輯:Oracle 資料庫基礎

核心演進時間軸

版本大對象類型關鍵特性狀態
Oracle 7LONG, LONG RAW2GB 上限、順序訪問、單列、SELECT 返回實際數據、無索引、無 PL/SQL 變量、無分布式已棄用
Oracle 8.0LONG, LONG RAW, CLOB, BLOB, NCLOB, BFILE引入 LOB 架構:4GB+ 存儲、隨機訪問、多列、SELECT 返回 **LOB 定位器 (Locator)**、支持 DBMS_LOB、內部/外部存儲LONG 棄用,LOB 正式商用
Oracle 8iLOB 增強臨時 LOB、LOB 緩存、並行 DML、Oracle Text 整合、Java LOB API
Oracle 9iLOB 成熟LOB 讀一致性、SecureFile 雛形 (BasicFile)、Data Pump 原生支持、LOB 索引分離
Oracle 11gSecureFile LOB壓縮/去重/加密、智能內存緩存、更優索引結構、並行度提升**現代標準**
Oracle 12c+SecureFile 增強PDB 級 LOB、In-Memory LOB、JSON 存儲優化、Sharding LOB 分片

LOB 四大類型深度對比

類型全稱存儲位置數據類型最大長度讀寫權限典型用途
CLOBCharacter Large Object內部 (數據庫中)單字節/多字節字符 (數據庫字符集)4GB ~ 128TB讀寫長文本、XML、JSON、日志、文檔內容
NCLOBNational Character Large Object內部Unicode 字符 (國家字符集 AL16UTF16/UTF8)4GB ~ 128TB讀寫多語言文本、需國家字符集語義的場景
BLOBBinary Large Object內部原始二進制 (圖片、音視頻、文檔、加密數據)4GB ~ 128TB讀寫多媒體、二進制文檔、序列化對象
BFILEBinary File**外部** (作業系統文件系統)原始二進制 (只讀)OS 文件系統限制 (通常 8EB+)**只讀**大型靜態媒體文件、歸檔數據、只讀共享數據

LOB 存儲架構:Locator + Data 分離

關鍵存儲屬性 (CREATE TABLE ... LOB 子句)

CREATE TABLE doc_store (
    id          NUMBER PRIMARY KEY,
    content     CLOB,
    metadata    BLOB,
    ext_file    BFILE
)
LOB (content) STORE AS SECUREFILE content_lob_seg (
    TABLESPACE lob_ts
    ENABLE STORAGE IN ROW       -- 小於 ~4KB 存行內,大於存行外 (默認 ENABLE)
    CHUNK 8192                  -- 讀寫單元,8KB 標準,不可大於塊大小
    RETENTION                   -- 保留舊版本供讀一致性/閃回 (AUTO/MAX/MIN/NONE)
    CACHE                       -- 緩存 LOB 數據到 Buffer Cache (CACHE/NO CACHE/CACHE READS)
    COMPRESS HIGH               -- SecureFile 壓縮: LOW/MEDIUM/HIGH
    DEDUPLICATE                 -- SecureFile 去重: 同表/跨表
    ENCRYPT USING 'AES256'      -- SecureFile 加密: TDE 整合
)
LOB (metadata) STORE AS BASICFILE meta_lob_seg ( -- 舊版 BasicFile
    TABLESPACE lob_ts
    DISABLE STORAGE IN ROW
    CHUNK 8192
    PCTVERSION 10               -- BasicFile 版本管理
    NOCACHE
);

DBMS_LOB 核心包 — LOB 操作標準 API

過程/函數功能關鍵參數適用類型
APPEND源 LOB 內容追加到目標 LOB 末尾dest_lob IN OUT NOCOPY, src_lob IN內部 LOB (CLOB/BLOB/NCLOB)
COPY從源 LOB 複制數據到目標 LOB (指定量/偏移)dest_lob IN OUT NOCOPY, src_lob IN, amount IN, dest_offset IN, src_offset IN內部 LOB
ERASE刪除 LOB 部分/全部內容 (置空/截斷)lob_loc IN OUT NOCOPY, amount IN OUT, offset IN內部 LOB
TRIM將 LOB 長度截斷到指定值lob_loc IN OUT NOCOPY, newlen IN內部 LOB
WRITE向 LOB 寫入數據 (指定偏移/量)lob_loc IN OUT NOCOPY, amount IN, offset IN, buffer IN內部 LOB
WRITEAPPEND追加寫入到 LOB 末尾lob_loc IN OUT NOCOPY, amount IN, buffer IN內部 LOB
READ從 LOB 讀取數據到緩衝區lob_loc IN, amount IN OUT, offset IN, buffer OUT內部/外部 (BFILE)
SUBSTR提取 LOB 子串 (返回 VARCHAR2/RAW)lob_loc IN, amount IN, offset IN RETURN VARCHAR2/RAW內部/外部
INSTR在 LOB 中搜索模式串位置lob_loc IN, pattern IN, offset IN, nth IN RETURN INTEGER內部/外部
GETLENGTH獲取 LOB 長度 (字符/字節)lob_loc IN RETURN INTEGER內部/外部
COMPARE比較兩個 LOB 全部/部分值是否相同lob_1 IN, lob_2 IN, amount IN, offset_1 IN, offset_2 IN RETURN INTEGER內部/外部
LOADFROMFILE從 BFILE 載入數據到內部 LOBdest_lob IN OUT NOCOPY, src_bfile IN, amount IN, dest_offset IN, src_offset INBFILE → CLOB/BLOB
CREATETEMPORARY創建臨時 LOB (會話/調用級生命週期)lob_loc IN OUT NOCOPY, cache IN, duration IN (SESSION/CALL)內部 LOB
FREETEMPORARY釋放臨時 LOBlob_loc IN OUT NOCOPY內部 LOB
CONVERTTOBLOB / CONVERTTOCLOB字符集轉換載入 (10g+)... csid IN, lang_context IN OUT, warning OUT跨字符集遷移

LONG → LOB 遷移路徑 (生產環境標準化)

  1. 11g+ 首選:`ALTER TABLE t MODIFY (long_col CLOB);` — **在線、秒級、元數據級、無數據移動、無鎖**。
  2. 10g/11g 通用**:`CREATE TABLE t_new AS SELECT pk, TO_LOB(long_col) AS clob_col, ... FROM t_old;` — 需鎖表、雙倍空間、重建索引/約束/權限。
  3. 跨平台/版本升級**:Data Pump `expdp/impdp` 導出導入,**12c+ impdp 自動將 LONG 轉 CLOB**。
  4. 應用層同步修改**:
    • JDBC: `ResultSet.getClob()` / `PreparedStatement.setClob()` 替代 `getString`/`setString`。
    • ODP.NET: `OracleClob` / `OracleBlob` 對象流式讀寫。
    • PL/SQL: 變量類型 `LONG` → `CLOB`,直接賦值/比較/DBMS_LOB 操作。

BFILE 專項:外部文件只讀訪問

創建與授權

-- 1. OS 層創建目錄並授權 oracle 用戶讀取
# mkdir -p /u01/app/oracle/bfile_data
# chown oracle:oinstall /u01/app/oracle/bfile_data
# chmod 750 /u01/app/oracle/bfile_data

-- 2. 數據庫創建 DIRECTORY 對象
CREATE OR REPLACE DIRECTORY ext_media_dir AS '/u01/app/oracle/bfile_data';
GRANT READ ON DIRECTORY ext_media_dir TO app_user;

-- 3. 表中存儲 BFILE
CREATE TABLE media_catalog (
    id       NUMBER PRIMARY KEY,
    title    VARCHAR2(200),
    media    BFILE
);

-- 4. 插入 BFILE (僅存儲指針)
INSERT INTO media_catalog (id, title, media)
VALUES (1, 'Sample Video', BFILENAME('EXT_MEDIA_DIR', 'sample.mp4'));

-- 5. 讀取 BFILE (需 DBMS_LOB.OPEN/CLOSE/READ)
DECLARE
    v_bfile BFILE := BFILENAME('EXT_MEDIA_DIR', 'sample.mp4');
    v_blob  BLOB;
BEGIN
    DBMS_LOB.OPEN(v_bfile, DBMS_LOB.LOB_READONLY);
    DBMS_LOB.CREATETEMPORARY(v_blob, TRUE);
    DBMS_LOB.LOADFROMFILE(v_blob, v_bfile, DBMS_LOB.GETLENGTH(v_bfile));
    DBMS_LOB.CLOSE(v_bfile);
    -- v_blob 現在包含文件內容,可進一步處理
    DBMS_LOB.FREETEMPORARY(v_blob);
END;
/

SecureFile vs BasicFile 選型決策

特性BasicFile (傳統)SecureFile (11g+ 推薦)
壓縮不支持LOW/MEDIUM/HIGH (CPU 換空間,典型 2-10x)
去重不支持表級/跨表級 (同表空間),極大節省重複數據空間
加密TDE 表空間級列級 TDE (AES128/192/256),更細粒度
內存緩存Buffer Cache (LRU)智能緩存 (自動熱數據進內存)
索引結構傳統 B-tree優化 B-tree (減少爭用、提升並發)
並行 DML受限完全支持並行 INSERT/UPDATE/DELETE
空間管理Free List / BitmapLocal Extent Management + ASSM (自動段空間管理) 原生
性能基準基準讀寫吞吐提升 2-5x,併發擴展性大幅提升
遷移成本現狀`ALTER TABLE ... MODIFY LOB (col) (SECUREFILE);` 在線重組 (需雙倍空間臨時)

總結

  • Oracle 7 的 LONG/LONG RAW 為**順序訪問、功能殘缺、已徹底棄用**。
  • Oracle 8.0 引入 **LOB 架構 (CLOB/BLOB/NCLOB/BFILE)**,確立 **Locator + Data 分離、隨機訪問、多列、4GB+、DBMS_LOB 標準 API** 核心模型,沿用至今。
  • **SecureFile (11g+)** 通過壓縮/去重/加密/智能緩存/優化索引,將 LOB 性能與存儲效率提升數量級,**所有新建 LOB 列強制使用 SecureFile**。
  • BFILE 解決**超大只讀外部文件**引用需求,不佔用數據庫存儲/備份空間,配合 `DBMS_LOB.LOADFROMFILE` 實現按需載入。
  • 遷移鐵律:**LONG → CLOB (ALTER TABLE MODIFY)**,**BasicFile → SecureFile (ALTER TABLE MODIFY LOB)**,**應用層同步升級 LOB API**。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved