1. 程式人生 > >DB2開發與效能優化

DB2開發與效能優化

正規化化原則

物理表:優先考慮降低資料冗餘度、消除二義性,在合理代價的前提下,以第三正規化為目標進行表設計。兼顧訪問效能、可擴充套件性等因素,可以在適當範圍內進行必要的降正規化處理,但必須有配套機制保證資料一致性。
臨時表:優先考慮程式訪問效能和便捷性,通常不受正規化化制約。

表空間使用和分配原則

使用者資料與系統資料分離
永久資料與臨時資料分離
表資料與索引資料分離
大物件資料獨立

欄位非空約束

物理表:儘量對所有欄位使用非空約束,並設定欄位預設值。特殊情況下,允許部分欄位不使用非空約束,但必須保證這些欄位不作為過濾條件、分組條件,且不參與表示式運算。
臨時表:所有欄位必須使用非空約束,非邏輯主鍵欄位儘量設定欄位預設值。

欄位排序

通用原則:表中欄位排序依次為:A類技術欄位、業務主鍵欄位、B類技術欄位、業務非主鍵欄位、C類技術欄位。
業務主鍵欄位排序原則:業務主鍵欄位多個時,按訪問頻度和欄位取值區分度由高到低排列。
業務非主鍵欄位排序原則:根據業務含義分組,業務含義相近的欄位排在一起;組間和組內再按訪問頻度由高到低排列,或按業務要素生成次序排列。
A類技術欄位:決定整表資料分佈的關鍵欄位。狀態快照表的快照日期、流水錶的資料日期。
B類技術欄位:決定單行記錄資料狀態的關鍵欄位。狀態拉鍊表的拉鍊起始日期。
C類技術欄位:存放單行記錄描述資訊的欄位。記錄生成日期、維護日期、維護使用者。

邏輯主鍵

所有表在設計階段必須確定邏輯主鍵。邏輯主鍵是應用可以正確識別表中記錄的必要條件。邏輯主鍵欄位數量較多時,可採用代理鍵欄位充當邏輯主鍵。以代理鍵作為邏輯主鍵時,原始邏輯主鍵仍需記錄在設計文件中。

物理主鍵

推薦對所有表均建立物理主鍵。物理主鍵通常與邏輯主鍵保持一致。存在多組邏輯主鍵時,建議將欄位訪問頻度最高的一組作為物理主鍵,其它組建立唯一索引或唯一約束。特殊情況下,允許表中不建物理主鍵。對常用於大批量批處理的表,為兼顧處理效能,可以不建物理主鍵。必須有相應的機制保證表中的資料對該表的邏輯主鍵而言具有唯一性。

外來鍵

在設計階段可以識別的外來鍵關係必須在設計文件中體現。外來鍵關係可作為資料完整性、一致性判斷的依據。外來鍵關係通常不需要物理化。將外來鍵關係物理化會給後續的批量資料處理和資料管理帶來一定程度的不便。可通過應用程式或資料質量校驗程式保證外來鍵關係。在某些對資料完整性要求極高的聯機應用系統中,關鍵的外來鍵關係可以物理化。

其它約束

業務性約束必須在設計文件中體現,但通常無需物理化。業務性約束可作為資料完整性、一致性判斷的依據。業務性約束通常由應用程式保證,可能隨業務需求發生變化。技術性約束通常必須物理化。

分割槽鍵設定原則

多分割槽資料庫中的所有表均必須顯式指定分割槽鍵。單分割槽資料庫中的表推薦在設計階段指定備選分割槽鍵。物理表優先選擇邏輯主鍵中區分度最高的單一欄位。臨時表優先選擇後續關聯條件或分組條件中包含的區分度最高的單一欄位。

索引建立原則

索引應按需建立,同一張表上的索引數量不宜過多。除物理主鍵所含唯一索引外,同一張表上的索引數量不宜超過三個。索引欄位選擇及排序原則:當索引由多個欄位組成時,除完全匹配外,使用其第一個欄位開始的子集對訪問效率也有提升作用。最優先考慮使用頻度:使用頻度較高的欄位優先選擇且排序靠前。次優先考慮欄位區分度:區分度較高的欄位排序靠前,區分度過低的欄位不建議包含在索引中。同一個索引中包含的欄位總數不宜超過四個。

臨時表宣告

必須集中在程式邏輯開始之前進行。必須符合資料物件設計規範。
必須顯式包含的選項:
not logged
with replace;
按需決定是否包含的選項:
on commit preserve rows
儘量避免使用like方式宣告臨時表,僅特殊用途除外。

臨時表使用

臨時表聲明後需顯式提交事務。臨時表上如需建立索引,必須在資料寫操作完成後建立。如果臨時表中存放的資料量較大,且根據程式邏輯已能確認後續程式段中不再使用該資料的,必須顯式將其中的資料清空。如果臨時表中存放的資料量較大,推薦在資料寫操作完成後顯式對其統計資訊進行收集。

鎖資源控制原則

程式中讀取物理表通常需要顯式指定最低隔離級別(with ur)。單個程式僅對一張物理表或檢視進行寫操作。多個程式對同一張物理表或檢視進行寫操作時,必須嚴格保證這些程式序列或互斥執行。查詢類程式禁止對物理表進行寫操作。資料處理程式中禁止顯式對物理表收集統計資訊。

日誌控制原則

一次性刪除目標表全部資料時,需使用truncate語句。
程式中對物理表進行寫操作資料量過大時,需採用替代方式處理。
insert:分段提交;
delete:儲存剩餘資料、清空目標表、插入已儲存資料;
update:儲存更新資料、儲存不變資料、清空目標表、插入以儲存資料。
日誌使用量較大的程式,需嚴格保證序列或互斥執行。

大表關聯限制

所有參與關聯的大表必須具備完全相同的分割槽鍵,即分割槽鍵欄位數量、順序、資料型別(大類)完全匹配。關聯條件必須包含分割槽鍵的所有欄位對應相等,分割槽鍵欄位上禁止使用函式或表示式,且只能以and邏輯運算連線。
關聯條件中需附加分割槽鍵欄位以外的其它條件時,也只能以and邏輯運算連線。
大表關聯之前需保證已收集統計資訊。

資料庫連線控制原則

線上應用系統應通過應用程式或中介軟體連線資料庫。
線上應用系統應具備資料庫連線中斷重連機制。
線上應用系統使用資料庫長連線時,每天必須至少重新整理一次連線。

造成批量資料處理程式效能問題的常見原因

分割槽鍵設定、索引設定、表關聯方式、預處理充分程度
分割槽鍵設定與使用:大表未設分割槽鍵、分割槽鍵欄位選擇不合理、分割槽鍵欄位資料型別或長度設定不合理、大表關聯時關聯條件中未同時包含雙方分割槽鍵欄位、大表分組統計時分組條件中未包含分割槽鍵欄位、訪問大表前未收集統計資訊
索引設定與使用:大表未根據訪問需要建立索引、同一張表上的索引數量過多、索引欄位選擇或欄位順序排列不合理、頻繁更新的大表上索引未定期重建、程式中動態建立索引的時機不合理、訪問含有索引的大表前未收集統計資訊
表關聯方式:在SQL語句中使用Common Table、在SQL語句中不合理使用子查詢、在子查詢中出現表關聯或分組統計
預處理充分程度:表關聯時在關聯條件中使用函式或表示式、分組統計時在分組條件中使用函式或表示式、在含有複雜關聯或分組統計的語句中同時出現複雜的邏輯運算、在同一程式中多次出現相同的複雜邏輯運算、一次性處理長週期範圍內超大資料量的資料
其它程式碼規範性問題:表關聯時將關聯條件與過濾條件混雜、訪問流水類大表時未指定時間段、程式中的臨時表定義和使用不合理、程式中對事務日誌佔用未進行有效控制、程式中或多個程式之間未考慮鎖機制可能造成的影響、對程式的輸入引數未進行有效性檢查、程式中呼叫其它程式時對子程式的返回值未進行有效性檢查