認識 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 |





留言