專案需對千萬列表執行批次插入與高頻查詢。初期嘗試 Hibernate 導致:
結論:海量資料場景拒絕 ORM,直寫 SQL / JDBC / 存儲過程才是正道。
-- 慢:全表掃描 + 傳輸所有欄位
SELECT * FROM huge_table;
-- 快:只取業務必要欄位,可走 Index Fast Full Scan / Covering Index
SELECT id, biz_key, amt FROM huge_table;
-- 慢:WHERE name LIKE '%' 導致全表掃描 + 函數評估
SELECT COUNT(id) FROM huge_table WHERE name LIKE '%'; -- 33 秒
-- 快:移除無意義條件
SELECT COUNT(id) FROM huge_table; -- 11 秒
CASE WHEN :param IS NOT NULL THEN col = :param END 或動態 SQL。-- 1. 使用陣列綁定 (JDBC batch / OCI Array Bind)
-- 2. 直接取 Sequence 下一值 (無序) 或使用 GUID
-- 3. 禁用索引/約束/觸發器,載入後重建
-- 4. 並行 DML (PDML) + APPEND Hint
INSERT /*+ APPEND PARALLEL(8) */ INTO target_table
SELECT * FROM staging_table;
APPEND:直接寫入 High Water Mark 以上,最小化 Redo/Undo。PARALLEL:多進程並行寫入,線性縮短時間。SELECT seq.NEXTVAL FROM dual CONNECT BY LEVEL <= 50000 一次取 5 萬值,消除網路往返。DBMS_STATS.GATHER_TABLE_STATS(..., ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE)。SQL Plan Baseline 或 SQL Profile 固定優質計畫。| 方案 | 插入 5 萬列 | 全表 COUNT |
|---|---|---|
| Hibernate (Sequence) | 600 秒 | N/A |
| JDBC Batch + Array Bind | 8 秒 | 11 秒 |
| PDML + APPEND + Staging | 3 秒 | 11 秒 |
千萬級資料處理三板斧:拒絕 ORM、精準投影、批次並行。架構層面引入 Staging Table + PDML + 統計資訊管理,可穩定支撐億級日增量。