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

DB2 實戰必備:20 個高頻命令與效能優化技巧全攻略

     編輯:DB2 教學

前言:從「會用」到「用好」DB2 命令列工具

DB2 命令列處理器(CLP)是 DBA 與開發人員日常操作的核心介面。本文精選 20 個高頻實用命令與技巧,涵蓋字串操作、大量資料清除、匯入匯出、表存在性檢查、鎖定排查、預存程序管理、快照監控、索引驗證、日期運算、別名建立、DDL 操作、序列定義等核心場景,助你大幅提升操作效率與問題排查速度。

核心命令與技巧詳細解析

1. 字串串接:使用 || 操作子

SELECT 'Hello' || ' ' || 'World' FROM sysibm.sysdummy1;
-- 結果:Hello World

符合 ANSI SQL 標準,可跨平台移植。

2. 大量資料高效清除三大法(效能由低到高)

方法命令範例特點適用場景
DELETEDELETE FROM test記錄日誌、觸發 Trigger、可回滾小量資料、需觸發器
IMPORT REPLACEIMPORT FROM /dev/null OF DEL REPLACE INTO test不記日誌(隱含),速度中等中量資料、需保留表結構
ALTER TABLE ... NOT LOGGED INITIALLY WITH EMPTY TABLEALTER TABLE test ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE完全不記日誌、極速、不可回滾大量資料清空、維護窗口

警告:NOT LOGGED INITIALLY 會導致該操作不可恢復,執行前務必確認備份策略。

3. 匯入/匯出支援格式:IXF(含結構)與 DEL(純資料)

-- 匯出
db2 "EXPORT TO filename.del OF DEL SELECT * FROM tablename"

-- 匯入(INSERT 模式,需表存在)
db2 "IMPORT FROM filename.del OF DEL INSERT INTO tablename"

-- 匯入(REPLACE 模式,清空後載入)
db2 "IMPORT FROM filename.del OF DEL REPLACE INTO tablename"

IXF 格式可保留欄位定義、索引、約束,適合跨環境遷移;DEL 格式輕量,適合純資料交換。

4. 檢查表是否存在

SELECT * FROM "SYSIBM"."SYSTABLES" WHERE LOWER(name) = 'afa_maintransdtl'

亦可查詢 SYSCAT.TABLES 視圖(權限較友善)。

5. 鎖定問題排查標準流程

db2 "CONNECT TO afa"
db2 "GET SNAPSHOT FOR LOCKS ON <實例名>"
db2 "TERMINATE"

分析快照輸出,找出 Application Handle(整數)對應的鎖定持有者,再強制釋放:

db2 "FORCE APPLICATION (<Application Handle>)"

進階:搭配 MON_GET_LOCKS 表函數獲取更豐富資訊。

6. 建立預存程序:指定自定義語句結束符

-- SQL 檔案內部使用 @ 作為結束符
CREATE PROCEDURE my_proc()
LANGUAGE SQL
BEGIN
  DECLARE v INT DEFAULT 1;
  WHILE v <= 10 DO
    INSERT INTO t VALUES (v);
    SET v = v + 1;
  END WHILE;
END @

-- 執行部署
db2 -td@ -vf filename.sql

-td@ 指定 @ 為結束符,避免程序內部分號衝突;-vf 顯示執行回饋。

7. 驗證索引是否被優化器採用

RUNSTATS ON TABLE afa.yj_jywtk WITH DISTRIBUTION AND DETAILED INDEXES ALL

收集分布統計與詳細索引統計後,再執行 EXPLAIN 或查看 SYSCAT.INDEXES 的 FULLKEYCARD、CLUSTERRATIO 等指標判斷索引效益。

8. 擷取完整資料庫快照


db2 "CONNECT TO <實例名>"
db2 "UPDATE MONITOR SWITCHES USING LOCK ON SORT ON BUFFERPOOL ON UOW ON TABLE ON STATEMENT ON"
db2 "GET SNAPSHOT FOR ALL ON <實例名>"

開啟所有監控開關後再擷取快照,可獲得鎖、排序、緩衝池、工作單元、表、語句等全維度效能資料。

9. 查詢預存程序原始碼

SELECT PROCNAME, TEXT FROM SYSIBM.SYSPROCEDURES

亦可查詢 SYSCAT.PROCEDURES 取得更豐富中繼資料(參數、權限、建立時間等)。

10. 列出當前 Schema 下所有表

LIST TABLES

加上 FOR SCHEMA <schema名> 可指定 Schema;SHOW DETAIL 顯示表空間、資料列數等細節。

11. 字串定位:LOCATE 函數

VALUES LOCATE('y', 'xyz')  -- 返回 2(1-based 索引)

若未找到返回 0。注意參數順序:LOCATE(搜尋字串, 目標字串, [起始位置])。

12. 計算兩日期相差天數

VALUES DAYS(DATE('2007-03-01')) - DAYS(DATE('2007-02-28'))
-- 返回 2

DAYS() 回傳自 0001-01-01 起的絕對天數,相減即得差值。亦可使用 DAYS_BETWEEN()(V9.7+)更直觀。

13. 建立跨 Schema/實例的表別名

CREATE ALIAS my_alias FOR other_schema.other_table
-- 或跨實例(需 Federation 設定)
CREATE ALIAS my_alias FOR remote_server.remote_schema.remote_table

別名不佔儲存空間,僅為名稱解析層面的指標,簡化 SQL 撰寫。

14. 查看表結構

DESCRIBE TABLE tablename
-- 或
DESCRIBE SELECT * FROM tablename

輸出欄位名、資料類型、長度、可否為 NULL、預設值、隱含欄位等資訊。

15-17. 資料庫啟動/啟用/停用/停止控制


RESTART DATABASE db_name      -- 崩潰恢復後重啟
ACTIVATE DATABASE db_name     -- 預先啟動,減少首次連線延遲
DEACTIVATE DATABASE db_name   -- 正常關閉,釋放記憶體

ACTIVATE 適合生產環境預熱;DEACTIVATE 會等待所有連線釋放才關閉。

18. 重命名表

RENAME TABLE old_name TO new_name

原子操作,自動更新相依物件(視圖、觸發器、約束等),索引與權限保留。

19. 定義序列


CREATE SEQUENCE orderseq
  START WITH 1
  INCREMENT BY 1
  NO MAXVALUE
  NO CYCLE
  CACHE 24

CACHE 24 可減少日誌寫入,提升高併發取號效能;NO CYCLE 避免數值回卷。

20. 查看表的所有索引詳細資訊

DESCRIBE INDEXES FOR TABLE tablename SHOW DETAIL

輸出索引名、欄位組合、唯一性、聚類比率、頁面數、層級、統計時間等關鍵指標,是索引調優的首選命令。

效率提升小撇步

  • 將常用命令存為 Shell 腳本或 CLP 腳本(.db2),參數化執行。
  • 善用 db2 -x 抑制標題輸出,配合管道符進一步處理(如 db2 -x "SELECT tabname FROM syscat.tables" | xargs -I{} db2 "RUNSTATS ON TABLE {}")。
  • 定期執行 RUNSTATS 並搭配 REBIND 確保套裝計劃與時俱進。
  • 建立個人命令速查卡(Cheat Sheet),包含上述 20 項與專案特有的高頻操作。

熟練掌握這 20 個命令與技巧,並理解其背後的原理與適用邊界,即能在 DB2 日維、開發、效能調優等各類場景中遊刃有餘。

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