分割表分為水平分割表和垂直分割表兩種。分割表增加了維護數據完整性的代價。
水平分割表:一種是當多個過程頻繁訪問數據表的不同行時,水平分割表,并消除新表中的冗余數據列;若個別過程要訪問整個數據,則要用連接*作,這也無妨分割表;典型案例是電信話單按月分割存放。另一種是當主要過程要重復訪問部分行時,最好將被重復訪問的這些行單獨形成子集表(冗余儲存),這在不考慮磁盤空間開銷時顯得十分重要;但在分割表以后,增加了維護難度,要用觸發器立即更新、或存儲過程或應用代碼批量更新,這也會增加額外的磁盤I/O開銷。
垂直分割表(不破壞第三范式),一種是當多個過程頻繁訪問表的不同列時,可將表垂直分成幾個表,減少磁盤I/O(每行的數據列少,每頁存的數據行就多,相應占用的頁就少),更新時不必考慮鎖,沒有冗余數據。缺點是要在插入或刪除數據時要考慮數據的完整性,用存儲過程維護。另一種是當主要過程反復訪問部分列時,最好將這部分被頻繁訪問的列數據單獨存為一個子集表(冗余儲存),這在不考慮磁盤空間開銷時顯得十分重要;但這增加了重疊列的維護難度,要用觸發器立即更新、或存儲過程或應用代碼批量更新,這也會增加額外的磁盤I/O開銷。垂直分割表可以達到最大化利用Cache的目的。
總之,為主要過程分割表的方法適用于:各個過程需要表的不聯結的子集,各個過程需要表的子集,訪問頻率高的主要過程不需要整表。在主要的、頻繁訪問的主表需要表的子集而其它主要頻繁訪問的過程需要整表時則產生冗余子集表。
注意,在分割表以后,要考慮重新建立索引。
3.2 存儲衍生數據
對一些要做大量重復性計算的過程而言,若重復計算過程得到的結果相同(源列數據穩定,因此計算結果也不變),或計算牽扯多行數據需額外的磁盤I/O開銷,或計算復雜需要大量的CPU時間,就考慮存儲計算結果(冗余儲存),F予以分類說明:
若在一行內重復計算,就在表內增加列存儲結果。但若參與計算的列被更新時,必須要用觸發器更新這個新列。
若對表按類進行重復計算,就增加新表(一般而言,存放類和結果兩列就可以了)存儲相關結果。但若參與計算的列被更新時,就必須要用觸發器立即更新、或存儲過程或應用代碼批量更新這個新表。
若對多行進行重復性計算(如排名次),就在表內增加列存儲結果。但若參與計算的列被更新時,必須要用觸發器或存儲過程更新這個新列。
總之,存儲冗余數據有利于加快訪問速度;但違反了第三范式,這會增加維護數據完整性的代價,必須用觸發器立即更新、或存儲過程或應用代碼批量更新,以維護數據的完整性。
3.3 消除昂貴結合
對于頻繁同時訪問多表的一些主要過程,考慮在主表內存儲冗余數據,即存儲冗余列或衍生列(它不依賴于主鍵),但破壞了第三范式,也增加了維護難度。在源表的相關列發生變化時,必須要用觸發器或存儲過程更新這個冗余列。當主要過程總同時訪問兩個表時可以合并表,這樣可以減少磁盤I/O*作,但破壞了第三范式,也增加了維護難度。對父子表和1:1關系表合并方法不同:合并父子表后,產生冗余表;合并1:1關系表后,在表內產生冗余數據。
4 數據庫對象的放置策略
數據庫對象的放置策略是均勻地把數據分布在系統的磁盤中,平衡I/O訪問,避免I/O瓶頸。
、 訪問分散到不同的磁盤,即使用戶數據盡可能跨越多個設備,多個I/O運轉,避免I/O競爭,克服訪問瓶頸;分別放置隨機訪問和連續訪問數據。
、 分離系統數據庫I/O和應用數據庫I/O。把系統審計表和臨時庫表放在不忙的磁盤上。
、 把事務日志放在單獨的磁盤上,減少磁盤I/O開銷,這還有利于在障礙后恢復,提高了系統的安全性。
、 把頻繁訪問的“活性”表放在不同的磁盤上;把頻繁用的表、頻繁做Join*作的表分別放在單獨的磁盤上,甚至把把頻繁訪問的表的字段放在不同的磁盤上,把訪問分散到不同的磁盤上,避免I/O爭奪;
、 利用段分離頻繁訪問的表及其索引(非聚族的)、分離文本和圖像數據。段的目的是平衡I/O,避免瓶頸,增加吞吐量,實現并行掃描,提高并發度,最大化磁盤的吞吐量。利用邏輯段功能,分別放置“活性”表及其非聚族索引以平衡I/O。當然最好利用系統的默認段。另外,利用段可以使備份和恢復數據更加靈活,使系統授權更加靈活。
文章來源于領測軟件測試網 http://www.kjueaiud.com/