2010年5月10日 星期一

Partition Table -- (II)

根據PostgreSQL網站的資料
http://www.postgresql.org/docs/8.1/interactive/ddl-partitioning.html
PostgreSQL支援 1. Range Partiontion    2. List Partition   兩種分割方式。實際上, 這兩種分割方式只是應用的不同, 它底層的機制, 是相同的。

我們最常使用到的分割,大概就是Range Partition。我們常會碰到隨著日期增加,資料量也不斷增加的資料,像是銀行的匯率資料,計程車隊的GPS定位資料等。這些資料,有些是不能丟,必需保存做為統計資料使用,這種資料,就必需使用partition的技術,進行保存,以方便後續的查詢使用。

但是,以系統設計的觀點來看,當你的資料會隨時間無限制增大的時候,整個系統的效能,勢必會被拖垮,容我提醒一聲,Patition並不是萬靈丹,它只是讓你操控大容量資料的一個手段而已,以之前提到的案例,銀行的匯率資料,過了一年(一個會計經營年度),恐怕就沒有什麼使用的價值,GPS定位資料,過了一個月(一個拆帳結算周期),恐怕也就沒什麼再使用的必要,在系統設計時,必需設計一個定期清理的機制,每年每月,將資料搬到備份表或歷程表中。只留下有使用價值的資料區間。

系統要使用的,必需是一個穩定的資料量或資料區間,否則,你就無法保證系統的穩定性。在這個設計前提下,我們才可以使用Partition的技術,技術是為系統服務的,絕對不要陷入為技術而技術的境地,這會傷害到你個人的價值。

簡單地講,PostgreSQL Partition Table的使用步驟如下:

1. 建立一個主資料表 Master table,主資料表必需有一個關鍵欄位,做為分隔界限的依據。
2. 繼承主資料表,建立子資料表 child table
3. 在子資料表建立限制Constraint, 限定關鍵欄位的區間間隔。
4. 在子資料表針對可能的查詢欄位,建立索引index
5. 開發rule 或 trigger, 對操作主資料表的行為(新增、修改、刪除),重導到子資料表去。
6. 把postgresql.conf 設定檔中的constraint exclusion參數打開,這樣針對主資料表的查詢,會針對子資料表進行最佳化。

完成上述的步驟後,我們對主資料表的新增、修改、刪除,PostgreSQL會自動地,對相應的子資料表做動作,當我們對資料表做出大資料量的查詢時,PostgreSQL會將查詢改寫,針對子資料表查詢,我們不會感覺到子資料表partition table 的存在。

沒有留言:

張貼留言