| 維度 | SQL SP | C SP |
| 執行效能 | 較低 (解析/編譯開銷) | 高 (原生機器碼) |
| 開發效率 | 高 (純 SQL/PL) | 低 (需編譯、部署、除錯) |
| 適用場景 | 邏輯簡單、SQL 複雜 (資料密集型) | 邏輯複雜、SQL 簡單 (計算密集型) |
| 部署 | 單一 CREATE PROCEDURE | 需編譯共享庫、註冊、權限設定 |
決策原則:以「工作量最小化」為前提,效能差異可接受時優先用 SQL SP。
2.4 查詢優化參數:HASH JOIN 與 RR_TO_RS
-- 啟用 Hash Join (需實例重啟生效)
db2set DB2_HASH_JOIN=Y
db2stop && db2start
-- 將 RR 隔離等級自動降為 RS,減少 Next-Key Lock 管理開銷
db2set DB2_RR_TO_RS=Y
db2stop && db2start
- Hash Join:大表連接無索引時效能提升顯著 (實測 7 張千萬列表 Join 從 72 秒大幅降低)。
- RR_TO_RS:應用程式若不強制需 RR,開啟此參數可減少鎖管理負擔。
2.5 避免 COUNT(*) 與 EXISTS 全表掃描
- COUNT(*):必須全表掃描,極慢,嚴禁用於大表判斷是否有資料。
- EXISTS:遇第一筆符合即停止,較快,但仍可能掃描大量頁面。
- 最佳替代方案:SELECT INTO + Exception Handler
DECLARE CONTINUE HANDLER FOR NOT FOUND SET V_NOTFOUND = 1;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET V_ERROR = 1;
SELECT COL1 INTO V_VAR FROM BIG_TABLE WHERE KEY = ? FETCH FIRST 1 ROW ONLY;
IF V_NOTFOUND = 1 THEN ... -- 無資料
ELSEIF V_ERROR = 1 THEN ... -- 多筆資料 (SQLCODE -811)
ELSE ... -- 找到單筆
END IF;
此法只讀取必要頁面,效能最佳。
- 游標計數法:若需判斷「是否超過 N 筆」,可用游標迴圈計數,達標即跳出,避免全表掃描。
3. 目錄查詢實用 SQL
3.1 檢視儲存程序原始碼
SELECT TEXT FROM SYSCAT.PROCEDURES WHERE PROCNAME = 'PROC1';
3.2 檢視表結構
DESCRIBE TABLE SYSCAT.PROCEDURES;
-- 或
DESCRIBE SELECT * FROM SYSCAT.PROCEDURES;
3.3 反向查詢:表被哪些 SP 使用
SELECT PROCNAME
FROM SYSCAT.PROCEDURES
WHERE SPECIFICNAME IN (
SELECT DNAME FROM SYSIBM.SYSDEPENDENCIES
WHERE BNAME IN (
SELECT PKGNAME FROM SYSCAT.PACKAGEDEP WHERE BNAME = 'TB_BRANCH'
)
);
3.4 查詢 SP 使用了哪些表
SELECT BNAME
FROM SYSCAT.PACKAGEDEP
WHERE BTYPE = 'T' AND PKGNAME IN (
SELECT BNAME FROM SYSIBM.SYSDEPENDENCIES
WHERE DNAME IN (
SELECT SPECIFICNAME FROM SYSCAT.PROCEDURES
WHERE PROCNAME = 'PR_CLEAR_MATCH_DIVIDE_SHA'
)
);
3.5 查詢 Function 被哪些 SP 使用
SELECT PROCNAME
FROM SYSCAT.PROCEDURES
WHERE SPECIFICNAME IN (
SELECT DNAME FROM SYSIBM.SYSDEPENDENCIES
WHERE BNAME IN (
SELECT PKGNAME FROM SYSCAT.PACKAGEDEP
WHERE BNAME IN (
SELECT SPECIFICNAME FROM SYSCAT.FUNCTIONS
WHERE FUNCNAME = 'GET_CURRENT_DATE'
)
)
);
3.6 一次 ALTER TABLE 新增多欄位
db2 "ALTER TABLE TB_TEST ADD COLUMN T1 CHAR(1) ADD COLUMN T2 CHAR(2) ADD COLUMN T3 INT"
- 單一陳述式完成多欄位新增,減少表鎖定時間與日誌量。
Function 相依性管理提醒
- 若要
DROP FUNCTION,必須先移除所有呼叫該 Function 的 SP。
- 建立 SP 時,被呼叫的 Function 必須已存在。
- 上一篇文章: DB2 程式設計技巧精選 (五) - 儲存程序、效能與管理指令
- 下一篇文章: DB2 程式設計技巧精選 (七) - 系統管理、安裝與環境設定
Copyright ©
程式碼之家 All Rights Reserved