表空間和表設計考慮事項
記錄尺寸和頁尺寸
固定長度的記錄比可變長度的記錄要好,因為處理固定長度記錄的DB2的代碼經過了優化。如果記錄是固定長度的,那么他就永遠不必從原來存儲的頁中被移動出來。然而,可變長度的記錄可能增長到不再適合原來頁的長度,因此他也就必須被移動到另一頁。無論何時記錄被順序訪問,都一定會出現一個額外的參考頁。DB2 UDB V8中的一個新特性就是當你不確定未來的數據長度增長情況時,允許你根據需要改動列的尺寸,這樣你就能不再需要創建可變長度的記錄。
每頁中記錄的數量也是需要考慮的內容。DB2提供了一些有關頁尺寸的選項,例如4 KB, 8 KB, 16 KB和32 KB 。比較好的起點是選擇默認的4KB,特別是當行的尺寸相對較小,或是對數據的訪問比較隨機的情況下。然而,在一些情況下,也需要考慮較大的頁尺寸。如果表中單個行的長度超過4KB,那么你就需要使用大一些的頁尺寸,因為DB2不支持跨行的記錄。
更有另一種情況是,當固定記錄的總長度比二分之一的頁(4KB)稍大一些的時候,一頁中就只能放置一個記錄。另外一種類似的情況是,固定記錄的總長度略長于三分之一頁、四分之一頁,等。這樣的設計不僅會浪費DASD空間,還會導致非常多的DB2操作消耗更多的資源。因此,對于上面描述的記錄而言,你需要考慮使用較大的頁尺寸,這樣就會相對地少浪費一些空間。
另外一些可能的頁尺寸為8 KB, 16 KB和 32 KB。頁的尺寸并不在創建表(CREATE TABLE)的語句中直接寫明。相反,表中頁的尺寸是由分配給包含這個表的表空間的緩沖池中的頁尺寸決定的。要獲得更周詳的信息,你能參考DB2 SQL 手冊中有關創建表空間(CREATE TABLESPACE)語句的內容。
非標準化考慮事項
邏輯數據模型是數據的一個最佳描述。物理數據模型則是數據在現實世界的實現。標準化只集中在數據的內涵上面,而不考慮可能訪問數據的應用程式的性能需求。數據庫設計的充分標準化會帶來性能的挑戰。
有關此類性能問題的一個非常常見的例子就是連接操作。通常情況下,標準化過程的結果是給各個獨立的表賦予相互關聯的信息。應用程式需要從這些表中訪問數據。關系數據庫提供了使用SQL語句來從多于一個的表中通過連接多個表去訪問信息的能力。取決于表的數目和他們各自的尺寸,連接操作可能會消耗非常多的資源和時間。
因為在I/T中有如此多的事情需要考慮,于是出現了一個折中的想法。對那些包含被頻繁訪問列的多個表中的數據保存副本,和連接表的性能相比,成本高還是低呢?在邏輯數據庫設計過程中,對你的數據模型盡量的執行標準化,之后再對其進行一定程度的非標準化,也許是進行潛在性能優化的一個選項。如果你決定進行非標準化了,要確保從頭到尾地記錄了文件:對某些細節的描述、執行非標準化步驟之后的推理,等。
設計較大的表
訪問非常大的DB2表需要消耗相當多的資源:CPU,內存,I/O。當設計大表的時候,用戶需要做的兩件最重要的事情就是:
實現分區
創建有用的索引
以上兩個問題將在下面進行周詳討論。
使用分段或分區表空間
如果數據中包含了LOB,那么用戶就必須創建LOB表空間。對于非LOB的數據,通常的選擇是分段或分區表空間,具體選擇哪一個在非常大程式上取決于你要存儲的數據量,同時還需要考慮相關應用程式需求的數據訪問類型。不太推薦使用單一的表空間。
分段表空間比單一的表空間具有更多的性能優勢,如下所示:
對于包含多于一個表的表空間,當DB2在一個表上獲得鎖定時,那個鎖定不影響其他表分段的訪問。
當DB2掃描一個表時,只訪問和那個表相聯系的分段。此外,空分段的頁不會被取出。
如果一個表被清除了,不必執行REORG實用工具集,他的分段就即時在COMMIT點上變成可再次使用的狀態。
如果一個表中的所有行被刪除了(被稱為塊刪除),不必執行REORG實用工具集,所有的分段都即時在COMMIT點上變成可再次使用的狀態。
塊刪除操作起來更加有效,并且書寫相當少的記錄信息。
COPY(復制)實用工具集不復制由于塊刪除或表清除所造成的空頁。
當表達到一個特定的尺寸,他們的可管理性和性能都能通過分區表空間獲得改善。如果你想獲得這方面的進展,在設計和創建時,以分區的形式定義表空間是個明智的做法。分區表空間的一些潛在優勢列舉如下:
并行性:你能利用三種類型的并行性,他們目前正應用于DB2 UDB。DB2 V3引入了查詢并行性(多個I/O路徑)。DB2 V4則實現了CP并行性(多CP之上的多任務)。DB2 UDB V5更是引入了系統查詢并行機制(多個DB2數據共享群之上的多任務)。DB2的發展進化,顯著提高了DB2應用程式處理分區表空間的并行處理能力。由于CPU時間的增加,這些查詢所消耗的時間也顯著的減少了。
在數據的一部分上工作:分區表空間允許DB2應用程式一次運行數據的一個分區,因而使其能夠同時運行另外分區上的另外的工作或應用程式。以同樣的方式,你能將塊UPDATE(更新)、DELETE(刪除)或INSERT(插入)操作分解為獨立的工作。除增加了可用性之外,這一技術也為完成這類DB2工作減少消耗的時間提供了可能。
更快的訪問被頻繁訪問的數據:如果分區索引能夠將更多的頻繁訪問的行從剩余的表中分離出來,然后將那些數據置于一個他自己的,并且應用更高速DASD設備的分區之內。
一般而言,表越大,就越應該將其創建為一個分區的表。不過也有一些實際例子表明為小表創建分區表空間是有利的。當查找表用于連接其他大分區表空間時,通過將查找表分區,你能夠使并行性在連接中最大化。
當你在連接謂詞中利用分區方法時,需要考慮一個決定性的因素。被連接在分區方法上的表應該具有相同的分區數,并且應該設定為相同的值。