「沒有比不執行的 SQL 性能更好的 SQL 了。」—— Prem Mehra
本系列針對:完全無用 SQL (應刪除)、過度執行 SQL (應減少)、應替換 SQL。目標:減少甚至消除對 DB2 的連接,善用 DB2 8/9 新特性解決老問題。
SELECT COUNT(*) INTO :hvcount FROM EMP WHERE STATUS = 'T';
UPDATE EMP SET STATUS = 'P' WHERE STATUS = 'T';
SELECT COUNT(*) INTO :hvcount FROM T WHERE ...;
IF :hvcount = 1 THEN
SELECT ... INTO ... FROM T WHERE ...; -- Singleton
ELSE
DECLARE CURSOR ...; OPEN ...; FETCH ...; -- Cursor
END IF;
SELECT COUNT(*) INTO :hvcount FROM T WHERE ...;
-- 計算總頁數 = :hvcount / 10 (每頁 10 行)
| 典型情況 | 策略 | 效益 |
|---|---|---|
| 通常 1 頁或少量頁 | 開 Cursor,FETCH 時計數。讀到第 11 行遇 EOF 即知總頁數 | 省去 COUNT 所有 GETPAGE/READ I/O |
| 通常 11-30 行 (2-3 頁) | 讀取並計數。第 31 行計數達 100 → 存入 COMMAREA,首頁顯示「Page 1 of 3」 | 避免多數情況下兩次讀取 |
| 3 頁以上 | 將用戶實際看到內容存 COMMAREA,延遲到最晚才執行 COUNT | 大多數情況避免 COUNT,程式邏輯健全 |
日常用 DB2 者請檢視自身代碼。下期將提供更多無用 SQL 範例與優秀替換方案。敬請期待第 2 部分。