LOAD 命令格式與 IMPORT 類似,關鍵字為 LOAD,但參數更豐富,詳細用法請參考 DB2 文件。兩者皆將輸入檔案資料移入目標表,差異將在實例中逐一說明。LOAD 前目標表必須已存在。LOAD 效能優於 IMPORT,原因稍後結合實例詳細解釋。LOAD 操作不記錄日誌,無法使用日誌檔案進行前滾恢復。
四階段皆為操作一部分,全部完成才算結束。各階段產生訊息協助 DBA 分析解決問題。IMPORT 每插入一行檢查約束並記日誌,LOAD 則批次處理。
DECLARE mycur CURSOR FOR SELECT * FROM org;
CREATE TABLE org2 LIKE org;
LOAD FROM mycur OF CURSOR INSERT INTO org2;
除游標外,尚支援檔案、管道、裝置裝入;IMPORT 僅支援檔案。
使用者定義的例外表儲存違反唯一約束與主鍵約束的行。未指定例外表時,違規行將被捨棄無法恢復。
CREATE TABLE STAFF1 LIKE STAFF;
INSERT INTO STAFF1 SELECT * FROM STAFF WHERE ID <= 160;
CREATE TABLE STAFFEXP LIKE STAFF1;
ALTER TABLE STAFFEXP ADD COLUMN TIME TIMESTAMP;
CREATE UNIQUE INDEX IDXSTAFF ON STAFF1(ID);
EXPORT TO D:STAFF.TXT OF DEL SELECT * FROM STAFF;
LOAD FROM D:STAFF.TXT OF DEL INSERT INTO STAFF1 FOR EXCEPTION STAFFEXP;
因 STAFF1 有唯一索引,部分資料違反約束無法插入,自動導向例外表 STAFFEXP。注意:例外表必須預先定義,LOAD 無法自動建立。
格式不正確的行會被拒絕,指定 DUMPFILE 檔案類型修飾符可將被拒記錄單獨存放。
LOAD FROM D:STAFF.TXT OF DEL MODIFIED BY DUMPFILE=d:dump
INSERT INTO STAFF1 FOR EXCEPTION STAFFEXP;
結果報告顯示轉換錯誤(如字串無法轉 SMALLINT),違反唯一約束的資料進入例外表。表進入「裝入掛起」狀態,需重新啟動或終止:
# 終止裝入,恢復表正常可用
LOAD FROM D:STAFF.TXT OF DEL TERMINATE INTO STAFF1;
# 修正來源檔案後重新啟動
LOAD FROM D:STAFF.TXT OF DEL RESTART INTO STAFF1;
使用 NOROWWARNINGS 檔案類型修飾符禁止警告訊息,大量警告時可大幅提升裝入效率:
LOAD FROM D:STAFF.TXT OF DEL MODIFIED BY NOROWWARNINGS INSERT INTO STAFF1;
STATISTICS 選項在裝入時生成統計資料供優化器決定最佳執行計畫。支援不同詳細層級:
# 最詳細統計(表與索引)
LOAD FROM D:STAFF.TXT OF DEL REPLACE INTO STAFF1
STATISTICS YES WITH DISTRIBUTION AND DETAILED INDEXES ALL;
# 簡略統計
LOAD FROM D:STAFF.TXT OF DEL REPLACE INTO STAFF1
STATISTICS YES AND INDEXES ALL;
注意:STATISTICS 僅與 REPLACE 相容,不相容 INSERT。結果需查詢系統表查看。
裝入資料違反檢查約束導致表進入檢查掛起狀態:
CONNECT TO sample;
CREATE TABLE STAFF1 LIKE STAFF;
ALTER TABLE STAFF1 ADD CONSTRAINT CHK CHECK(DEPT < 100);
# 修改資料檔使最後一行 DEPT=150 違反約束
LOAD FROM D:STAFF.TXT OF DEL INSERT INTO STAFF1;
SELECT * FROM STAFF1; -- 錯誤 SQL0668N 原因代碼 1
# 解除檢查掛起
SET INTEGRITY FOR STAFF1 CHECK IMMEDIATE UNCHECKED;
SELECT * FROM STAFF1; -- 正常可用,違規資料保留
大量資料時 LOAD 明顯優於 IMPORT:不逐行插入檢查約束、直接寫入資料庫頁、不寫日誌。
關鍵效能控制選項: