三步驟產生千萬筆測試資料
1. PL/SQL Developer 匯出基礎 CSV
SELECT object_id, object_name FROM dba_objects;
-- 右鍵匯出 → 1.csv (約 5 萬筆)
2. Linux Shell 迴圈擴充至 1000 萬筆
#!/bin/bash
for ((i=1; i<=200; i++)); do
cat 1.csv >> 2.csv
echo $i
done
# 50000 * 200 = 10,000,000 筆
wc -l 2.csv # 確認筆數
3. SQL*Loader 控制檔與執行
-- 1.ctl
LOAD DATA
INFILE '2.csv'
INTO TABLE my_objects
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(object_id, object_name)
sqlldr userid=scott/tiger control=1.ctl log=1.log direct=true
關鍵控制檔參數說明
| 選項 | 說明 |
| INFILE '*' | 資料在控制檔 BEGINDATA 之後 |
| BADFILE | 錯誤記錄檔 |
| APPEND / INSERT / REPLACE / TRUNCATE | 載入模式:追加/空表/覆蓋/截斷 |
| POSITION(m:n) | 固定寬度欄位位置 |
| TERMINATED BY | 分隔符號 |
| DIRECT=TRUE | 直接路徑載入,繞過 SQL 層,極快 |
| PARALLEL=TRUE | 多進程並行載入 (需分區表/多檔案) |
| UNRECOVERABLE | 搭配 DIRECT=TRUE,不產生 REDO,極大幅提速 |
實測效能 (VM 環境:1 核 2.8GHz, 1GB RAM)
- 200 萬筆 / 79 MB → 30 秒
- 1100 萬筆 / 392 MB → 226 秒
大規模載入優化清單
- 目標表設
NOLOGGING + 控制檔 UNRECOVERABLE + DIRECT=TRUE。
- 預先建立分區表,配合
PARALLEL=TRUE 多檔案並行載入。
- 先用小檔案驗證控制檔正確,再切換大檔案。
- 關閉不必要的索引/約束,載入完成後重建。
- 調整
READSIZE, BINDSIZE, ROWS 參數 (命令列) 優化記憶體緩衝。