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

減少與 DB2 for z/OS 會話(中):經驗法則與新編程技巧

     編輯:DB2 教學

上一期專欄提出「不必要的 SQL」概念,目標讓程式設計師深思每條陳述式在特定時間的必要性。展示兩類 SQL:可完全移除者、可延遲至適當時機再執行者。本期繼續提供 SQL 範例,涵蓋執行過於頻繁、可用更新更好的 SQL 取代的情況。歡迎進入「減少與 IBM DB2 會話」三部曲第二部分。

經驗法則:控制中斷邏輯

編寫批次程式的效能基本規則之一:可能時使用控制中斷邏輯。非 DB2 專屬概念,純屬良好編程實踐。檢查控制中斷或值變更,可減少 DB2 連接——只有擔心值與上次查詢不同時才查表。優化需特定順序輸入資料(如 ITEM 在 STORE 中,STORE 在 REGION 中),但即使資料已按序儲存,中斷邏輯仍確保 REGION 所需 SQL 僅對每個 REGION 執行一次,STORE 僅對該 REGION 每個 STORE 執行一次,ITEM 僅對該 STORE 每個 ITEM 執行一次。

順帶一提,DB2 執行的參考完整性不使用控制中斷邏輯。對每個 INSERT/UPDATE/DELETE/MERGE 檢查外鍵值,即使目標欄值與前一列相同。使用程式執行參考完整性時,可選擇僅在目標欄值不同時驗證——即控制中斷時驗證。

將小型參考表預載入程式記憶體

效能優化另一基本規則:適當時將小型參考表預載入工作儲存表,避免不必要的多次 DB2 連接。有人質疑:「哪種產品會載入值到工作儲存以避免連接該產品?」回答:「認識到程式設計師有選擇與腦力,理解避免不必要調用、連接、取得頁面是好主意的產品。」DB2 雖快且有緩衝池,但連接 DB2 100 萬次讀 10 列表格,遠不如連接一次讀 10 列至工作儲存、再址程式記憶體 100 萬次聰明。

減少巢狀選擇重複執行次數

考慮 SQL:對輸入序列檔每個選項,在大表查詢 col1/col2/col3。資料按項目編號排序,程式檢查項目編號是否不同。深入看 SQL:巢狀選擇在 Eastern 區建立部門清單,確保目標部門在清單中。可立即建立「Eastern 區部門」清單,查詢無需連接 DB2。使用 V8 列集定位游標連接 DB2 取清單,改用硬編碼清單(從陣列建構):

Declare CursorDept with rowset positioning for
Select deptno from little_dept_table Where division = Eastern
Fetch next rowset from CursorDept For 20 rows Into :hvarray-deptno
Select col1, col2, col3 From big_table where item = :hv-item-just-read
And big_table.deptno in (:hvdept1, :hvdept2, ... :hvdept20)

若部門少於 20 個(如 15),無需動態 SQL,第 16-20 個主機變數保留最新值即可。

更新/刪除前讀取列的反模式

資深程式設計師需克服根深蒂固習慣。早期必須讀取記錄才能更新/刪除。DB2 中若不需建立前映像,無需讀取列即可更新刪除。常見批次程式用游標「擷取、更新、擷取、更新...」,實際只需用 DECLARE CURSOR 相同 WHERE 子句執行合理大小的 SET 更新:

-- 避免此模式
Declare CursorUpd for Select col1, col2, ... From tableA Where jobcode = :hvj for update of salary
Fetch CursorUpd into :hvcol1, :hvcol2, ...
Update salary set salary = salary + 1000.00 where current of CursorUpd

-- 採用 SET 處理
Update tableA Set salary = salary + 1000.00 Where jobcode = :hvj

SET 處理是關聯設計最大優勢之一。必須確保 SET 大小不透過鎖定級聯建立無法接受的恢復單元或問題,或導致其他並發程式鎖定問題(如逾時)。

有時見「擷取、更新」混合後續單一實例 SELECT(之前讀取、更新、之後查看)。用最新編程技術,意識到不需前映像,可 DECLARE 列定位游標 SELECT 我們的 SET update,再 FETCH 合理大小列集(如一次 100 列)查看維護結果。單列擷取極少使用——可連接一次看 100 列時,為何連接 100 次?

敬請期待第三部分,將探討更多避免或減少 DB2 連接的更新技術。

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