top of page

認識 Oracle Database In-Memory:架構、部署與最佳實踐

  • 7月15日
  • 讀畢需時 4 分鐘

文章撰寫:Daniel Hsu / 奧登資訊技術顧問



前言

 

Oracle Database In-Memory(簡稱 DBIM)是 Oracle 12c R1 起內建的雙格式儲存技術。它讓同一份資料同時以列格式(Row Format)與欄格式(Columnar Format)存在記憶體中,無需變更應用程式即可大幅提升分析查詢速度。

 

OLTP 交易走列格式,分析查詢自動走欄格式,兩者並行不悖,真正實現 HTAP(Hybrid Transactional/Analytical Processing)。

 

核心優勢:零應用程式修改,Oracle Query Optimizer 自動決定最佳查詢路徑,讓 OLTP 與分析查詢在同一資料庫中共存。


關鍵數據

100x

分析查詢速度提升(最高倍數)

10x

資料壓縮比(欄格式壓縮)

0

應用程式修改需求

 

 

核心架構

 

雙格式儲存設計(Dual-Format Architecture)

Oracle In-Memory 在 SGA(System Global Area)中劃出獨立的 IM Column Store(IMCS)區域,將資料以欄式格式(IMCUs)壓縮存放。

 

磁碟上的資料仍以傳統列格式儲存。當資料庫啟動後,標記為 INMEMORY 的物件會自動以欄格式載入至 IMCS,形成雙格式並存:

 

Buffer Cache

(列格式 Row Format)

 

• 適合 OLTP 交易(INSERT / UPDATE / DELETE)

• 點查詢(Point Query)效率最佳

• 每列包含所有欄位資料

IM Column Store

(欄格式 Columnar Format)

 

• 適合分析查詢(全欄掃描、GROUP BY、SUM)

• 利用 SIMD 向量化運算加速

• 每欄資料連續存放,壓縮率極高

 

IMCU(In-Memory Compression Unit)

IMCS 的基本儲存單元,每個 IMCU 儲存一個欄的一段資料範圍,並包含 Storage Index 記錄最大/最小值,讓掃描時可跳過不符合條件的 IMCU,大幅減少 I/O。

 

資料一致性保證

DML 操作發生時,Oracle 以 Transaction Journal 記錄變更,確保 In-Memory 資料不過期。背景進程(IMCO / Wnnn)負責非同步 repopulate IMCU,不影響前台交易效能。



如何啟用與使用

 

Oracle In-Memory 只需三個步驟即可啟用,整個過程無需修改應用程式 SQL。

 

步驟一:設定 In-Memory Column Store 大小

在初始化參數中分配 IMCS 空間。建議以目標資料量的 1/2 估算(壓縮後約縮小 2–10 倍)。


-- 設定 IMCS 大小(需重啟資料庫)  ALTER SYSTEM SET inmemory_size = 10G SCOPE=SPFILE;   -- 動態調整(12.2 以上支援,不需重啟)  ALTER SYSTEM SET inmemory_size = 20G;   -- 確認目前配置 SELECT pool, alloc_bytes/1024/1024 alloc_mb,        used_bytes/1024/1024 used_mb FROM v$inmemory_area;




步驟二:將 Table / Partition 標記為 INMEMORY

以 DDL 指定哪些物件要載入記憶體,可選擇壓縮方式、優先級與欄位範圍。


-- 整張表(預設壓縮等級 FOR QUERY HIGH)  ALTER TABLE sales INMEMORY;   -- 指定壓縮等級與優先載入 

ALTER TABLE orders   I

NMEMORY MEMCOMPRESS FOR QUERY HIGH  

PRIORITY CRITICAL;  -- 僅載入特定欄位(節省空間)  ALTER TABLE customers INMEMORY  

NO INMEMORY (address, remarks);   -- 針對單一 Partition ALTER TABLE sales  

MODIFY PARTITION sales_2024  

INMEMORY PRIORITY HIGH;




步驟三:監控載入狀態

透過系統視圖確認資料是否完整載入,以及查詢是否確實走 In-Memory 路徑。


-- 查看各物件載入狀態  SELECT segment_name, populate_status,        bytes/1024/1024            orig_mb,       

nmemory_size/1024/1024    im_mb,       

bytes_not_populated/1024/1024 not_loaded_mb

FROM v$im_segments;  

-- 確認查詢計畫走 In-Memory(TABLE ACCESS INMEMORY FULL) 

EXPLAIN PLAN FOR  

SELECT region, SUM(amount) FROM sales GROUP BY region;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);




壓縮等級比較

 

Oracle 提供多種 MEMCOMPRESS 等級,在查詢效能與記憶體節省之間取得平衡:


壓縮等級

壓縮比

查詢速度

適用情境

FOR DML

~2x

最快

高頻 DML 表

FOR QUERY LOW

~4x

一般分析查詢

FOR QUERY HIGH(預設)

~6x

大多數情境推薦

FOR CAPACITY LOW

~8x

記憶體受限環境

FOR CAPACITY HIGH

~10x

較慢

極大資料集

 

建議:一般情境使用預設的 FOR QUERY HIGH,兼顧壓縮率(~6x)與查詢效能。記憶體充足時可改用 FOR QUERY LOW 或 FOR DML 以換取更快的載入與查詢速度。




適用情境


  • 即時報表與 BI:加速 BI 工具(Tableau、Power BI、OBIEE)的底層 SQL,讓報表從分鐘級降至秒級,使用者無需等待。

  • 混合 HTAP 工作負載:同一資料庫同時承擔 OLTP 與分析查詢,不再需要 ETL 搬資料到獨立 DW,架構更精簡。

  • 大型 Fact Table 聚合:億級行資料的 SUM/COUNT/AVG 聚合查詢,利用 SIMD 向量化運算與欄格式連續讀取大幅加速。

  • 複雜多條件篩選:多欄 WHERE 條件的掃描,利用 Storage Index 跳過不符合的 IMCU,顯著減少掃描資料量。

  • ERP / 財務月結加速:SAP、Oracle ERP 等系統月結批次查詢,無需修改應用程式即可享受加速效果,減少月結時間。

  • 取代部分物化視圖:原本需要預計算的物化視圖,改由 In-Memory 即時計算,省去排程維護成本與資料延遲。



核心效益

 

  • 零修改即享加速:無需改寫 SQL、無需更換應用程式,只需設定 INMEMORY 屬性,Oracle 自動路由查詢至最佳路徑。

  • OLTP 完全不受影響:列格式與欄格式各自獨立,DML 交易性能不降低,In-Memory 更新以背景異步方式進行。

  • 降低 TCO:減少對獨立 DW、ETL 工具與 In-Memory 資料庫(如 SAP HANA)的依賴,系統架構更精簡,維護成本降低。

  • 完整資料一致性:使用標準 Oracle MVCC 機制,In-Memory 資料永遠與磁碟同步,不會有過期資料問題。

  • RAC 水平擴展:RAC 環境下不同節點可載入不同 Partition,實現記憶體內資料分散,有效擴大 In-Memory 容量上限。

  • SIMD 向量化運算:充分利用現代 CPU 的 AVX-512 指令集,單次指令處理多組欄位資料,大幅提升掃描吞吐量。




Oracle 官方參考文件

以下為 Oracle 官方提供的 In-Memory 相關技術文件:

Oracle Database In-Memory Guide(19c)

官方完整指南:架構、設定、調校、監控一次掌握

Oracle Database In-Memory 技術白皮書

深入技術原理:IMCU、Storage Index、SIMD 向量化運算詳細說明

Oracle LiveSQL — In-Memory 互動教學

免費線上環境,直接在瀏覽器實際操作 In-Memory SQL




留言


bottom of page