效能測試、SQL 調優、分頁驗證常需大量測試資料。Oracle 字典視圖 DBA_OBJECTS (約 7-9 萬行) 是優質種子資料源。本文提供 PL/SQL 區塊,透過 INSERT /*+ APPEND */ 直接路徑載入 + 迴圈疊加,快速建立 500 萬行測試表,含完整欄位結構與提交控制。
CREATE TABLE test NOLOGGING AS
SELECT ROWNUM AS id, a.*
FROM dba_objects a
WHERE 1=2; -- 僅複製結構,不複製資料
-- 表結構包含:ID, OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_ID,
-- DATA_OBJECT_ID, OBJECT_TYPE, CREATED, LAST_DDL_TIME,
-- TIMESTAMP, STATUS, TEMPORARY, GENERATED, SECONDARY
DECLARE
l_cnt NUMBER;
l_rows NUMBER := &1; -- 目標行數,執行時傳入 5000000
BEGIN
-- 首輪直接載入種子資料
INSERT /*+ APPEND */ INTO test
SELECT ROWNUM, a.*
FROM dba_objects a;
l_cnt := SQL%ROWCOUNT; -- 約 7-9 萬
COMMIT;
-- 迴圈疊加至目標行數
WHILE (l_cnt < l_rows) LOOP
INSERT /*+ APPEND */ INTO test
SELECT ROWNUM + l_cnt,
owner, object_name, subobject_name,
object_id, data_object_id,
object_type, created, last_ddl_time,
timestamp, status, temporary,
generated, secondary
FROM test -- 關鍵:從自身讀取,避免重掃 DBA_OBJECTS
WHERE ROWNUM <= l_rows - l_cnt;
l_cnt := l_cnt + SQL%ROWCOUNT;
COMMIT;
END LOOP;
END;
/
-- 執行時輸入目標行數
Enter value for 1: 5000000
| 技巧 | 作用 |
|---|---|
NOLOGGING 建表 | 初始載入與後續 APPEND 最小化 Redo |
INSERT /*+ APPEND */ | 直接路徑載入,繞過 Buffer Cache、高水位線以上寫入 |
種子資料來源 DBA_OBJECTS | 真實結構、豐富型別、行數適中、無需額外建立 |
迴圈讀取 FROM test 自身 | 第二輪起從目標表讀取,利用已載入資料指數級增長,極快 |
ROWNUM + l_cnt 生成唯一 ID | 保證主鍵不重複,無需 Sequence 開銷 |
批次 COMMIT | 控制 Undo/Redo 規模,避免單一巨大事務 |