SQL*Loader 架構
sqlldr (Client) 讀取資料檔 → 解析控制檔 → 載入資料庫
- 兩種路徑:
- Conventional Path:經 SQL 層 (INSERT)、產生 Redo、觸發器啟動
- Direct Path:繞過 SQL 層、直接格式化資料區塊寫入、最小 Redo、不啟動觸發器
控制檔語法完整指南
LOAD DATA
INFILE 'data.csv' "str '\r\n'" -- 資料檔與記錄分隔符
BADFILE 'data.bad' -- 錯誤記錄
DISCARDFILE 'data.dsc' -- 不符合條件記錄
DISCARDMAX 1000 -- 最大捨棄筆數
INSERT -- 載入模式: INSERT/APPEND/REPLACE/TRUNCATE
INTO TABLE target_table
WHEN (1:1) <> 'H' -- 記錄篩選條件 (跳過標題列)
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' -- 欄位分隔
TRAILING NULLCOLS -- 尾部缺失欄位視為 NULL
(
col1 CHAR(10) "UPPER(:col1)", -- 欄位定義 + SQL 運算式
col2 DATE "TO_DATE(:col2,'YYYY-MM-DD')",
col3 INTEGER EXTERNAL(5),
col4 DECIMAL EXTERNAL(10,2),
col5 POSITION(50:60) CHAR(11) -- 固定寬度定位
)
實戰範例:CSV 載入
資料檔 (data.csv)
1,Default Web Site,192.168.2.254:80:,RUNNING
2,Other,192.168.2.254:80:test.com,STOPPED
3,Third,192.168.2.254:81:thirdabc.com,RUNNING
控制檔 (load.ctl)
LOAD DATA
INFILE 'data.csv'
BADFILE 'data.bad'
DISCARDFILE 'data.dsc'
APPEND
INTO TABLE resultxt
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
resultid CHAR(10),
website CHAR(50),
ipport CHAR(50),
status CHAR(20)
)
執行命令
sqlldr userid=fancy/testpass control=load.ctl log=load.log
DIRECT=TRUE PARALLEL=TRUE ERRORS=10000
READSIZE=1048576 BINDSIZE=10485760
Direct Path 載入關鍵參數
| 參數 | 建議值 | 說明 |
| DIRECT | TRUE | 啟用直接路徑 |
| PARALLEL | TRUE | 平行載入 (需分區表 + 多資料檔) |
| ERRORS | 10000+ | 容許錯誤筆數,避免單一錯誤中止 |
| ROWS | 10000 | Conventional path 陣列大小 / Direct path 資料儲存點間隔 |
| READSIZE | 1M-10M | 讀取緩衝區大小 |
| BINDSIZE | 10M+ | 綁定陣列大小 (Conventional) |
| STREAMSIZE | 256K-1M | Direct path 串流緩衝區 |
| SKIP_INDEX_MAINTENANCE | TRUE | 載入後索引標記 UNUSABLE,稍後 REBUILD |
| SKIP_UNUSABLE_INDEXES | TRUE | 允許載入有 UNUSABLE 索引的表 |
平行直接路徑載入架構
-- 1. 表需分區
CREATE TABLE sales (...) PARTITION BY RANGE (sale_date) (...);
-- 2. 多個資料檔對應分區
sqlldr ... DIRECT=TRUE PARALLEL=TRUE FILE=data_p1.dat ...
sqlldr ... DIRECT=TRUE PARALLEL=TRUE FILE=data_p2.dat ...
-- 每個進程載入不同分區,無鎖衝突
效能調優清單
- 預排序資料:依索引鍵排序,減少索引維護
- 停用索引/約束:載入後重建,避免逐筆維護
- 大量提交:
ROWS 設大值、COMMIT=Y (Conventional)
- NOLOGGING:Direct Path 隱含最小 Redo,表空間
NOLOGGING 更極致
- 多檔案平行:CPU 核心數匹配平行度
- 預先分配空間:
ALTER TABLE ... ALLOCATE EXTENT 避免擴展等待
常見問題排查
| 現象 | 原因 | 解決 |
| ORA-01652: unable to extend temp segment | 排序/雜湊區不足 | 增加 PGA、用 Direct Path、預排序 |
| SQL*Loader-350: Syntax error | 控制檔語法錯誤 | 檢查引號、括號、欄位定義 |
| 載入極慢 | Conventional Path + 索引/觸發器 | Direct Path + SKIP_INDEX_MAINTENANCE |
| 字符集亂碼 | NLS_LANG 不匹配 | 設定 NLS_LANG=資料檔字符集 |