首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 綜合知識

提升 DB2 INSERT 效能的關鍵技巧(一):從準備到提交全流程優化

     編輯:DB2 綜合知識

INSERT 處理流程概覽

插入一列資料經歷以下步驟,每步皆有優化空間:

  1. 客戶端準備陳述式(動態 SQL 需於執行前準備,靜態 SQL 預先完成)
  2. 客戶端組裝欄值發送至 DB2 伺服器
  3. 伺服器判斷目標頁面
  4. 緩衝池預留位置:既有頁需讀碟,新頁需在表空間分配(SMS 需物理分配),最終從緩衝池寫回磁碟
  5. 目標頁面格式化列資料,獲得 X (exclusive) 列鎖
  6. 寫入日誌緩衝區
  7. 提交交易:若日誌緩衝區未寫入日誌檔案則強制寫入

額外處理(索引、觸發器等)亦影響效能,後文將討論。

INSERT 替代方案:LOAD 與 IMPORT

  • IMPORT:SQL INSERT 前端,具備部分實用功能。
  • LOAD:直接格式化資料頁,避免逐列處理開銷(幾乎消除日誌記錄),更善用多處理器並行。V8 新增從游標載入與從 CLI 應用程式載入兩大功能,大幅提升 LOAD 替代 INSERT 的吸引力。

從游標載入

declare staffcursor cursor for select * from staff;
load from staffcursor of cursor insert into myschema.new_staff;

等同於 insert into myschema.new_staff select * from staff,但效能提升近 20%。

從 CLI 載入

僅限 CLI 應用,速度極快。附帶範例顯示:LOAD 速度是完全優化陣列插入的 2 倍,較未優化陣列插入快近 10 倍。

INSERT 優化全攻略

1. 陳述式準備

重複執行相同 INSERT 時,存取計劃進入套件快取可免除編譯開銷。但若每列 VALUES 值不同,每句皆視為唯一需獨立編譯。解決方案:使用參數標記:

-- 避免這樣:
insert into mytable values (1, 'abc');
insert into mytable values (2, 'def');
-- 改用參數標記,一次準備,重複執行:
insert into mytable values (?, ?);

靜態 SQL 使用主機變數同樣受益。可使一系列 INSERT 速度提升數倍。

2. 發送欄值至伺服器

關鍵技巧:單一 INSERT 陳述式包含多列,減少客戶端-伺服器往返與 DB2 開銷。多列插入技巧將於下篇詳細說明。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved