2013年11月4日 星期一

PartitionFunction 切割大資料表 (Table)

當有一個資料表 (Table) 的內容高達 10GB、上千萬筆時,你會用啥方法增進存取的效能?
  1. 使用 Disk Array(當然大家都會將資料庫放到磁碟陣列中)
  2. 使用更快的硬碟、更快的 CPU、更好的 Server(當然硬體規格越優越好囉)
  3. 針對該資料表常被 Query、Join 的欄位 (Column) 做索引 (Index)
  4. 還有呢?
當某一個資料庫 (Database) 很大時,我們會用檔案群組 (File Group, FG) 來做切割,使資料的存放不但能運用一個磁碟陣列來加速,還能一次用多個磁碟陣列一起工作。
但是?單一 Table 超大時,卻無法單純的因為多了幾個 ndf 就飛快了起來
怎麼辦?
※當某資料表連做索引都無法有效提昇效能時,可以利用 Partition 將資料表內容分割到多個檔案群組去,以加快存取速度。
Partition Table 建立步驟
  1. 建立DB、Table、File Group(s)、設定FG的檔案位置、大小、最大空間使用限制、每次成長量(這些是基本的設定值)
  2. 建立 Partition Function (PF):定義被切割欄位的屬性與切割點(例如:Datetime 就以日期來做為切割)
    \\SSMS\Database\Storage\Partition Functions\
  3. 建立 Partition Scheme (PS):將檔案群組(FG) 加入到剛剛建立的 Partition Function
  4. 若是運用在新建立的 Table 上
    CREATE TABLE tbl_xxx
    ( tid int IDENTITY(1,1) NOT NULL
    ....... )
    ON ps_xxx
    表示套用 Partition Scheme ps_xxx 來做為儲存此 Table 的方式
Table 套用 Partition Scheme 後,當你做INSERT 時,自動會以 Partition Function 定義的切割點,來決定某一筆資料存放在哪個 File Group 的 mdf 或 ndf 。
Table 的資料內容使用不同的檔案群組,不但可以加快 Disk I/O ,更能減少被 Data Lock 的機會。
-------------------------------------------
QQ:已經存在的資料表怎麼套用 Partition Scheme?
A:
  1. 當然你可以單純的建立一個新的 Table ,並先套用好 Partition Scheme ,接著將原本的資料以 Select Into 方式逐筆插入,最後再改個 Table Name 就ok了。
  2. 使用圖形介面,以SSMS 來實作
一開始的時候,所有筆數的內容都放在同一個檔案群組,如果你沒額外設定,那會是位於檔案群組的「Default」,也就是一般的「Primary」mdf 檔案。

Default 建立物件預設存放的地方 \\SSMS\DB Properties

↓ 對已存在的 Table 做 Partition

↓ Partition 精靈

↓ 選擇要以哪一個欄位作為切割的依據,這點必須跟 Partition Function 搭配

↓ 建立 / 選擇 Partition Function

↓ 建立 / 選擇 Partition Scheme

↓ 依前面所選的欄位及Partition Function 條件,選擇切割的條件點 Boundary。(這邊會直接帶出值,是因為我在 Partition Function 中的設定)

↓ 選擇輸出方式,如果要直接套用就選(Run Immediately)

↓ 最後的確認

↓ 執行完成

↓ 在查詢一下,嗯嗯~依照我們所定義的切割方式、切割點,將資料表分成了四個群,底下為每一群的筆數。

咦?怎麼分割區一裡頭沒任何資料呢?那是因為我用時間切割,並且第一個切割點的時間左邊,並無任何條件滿足,所以導致了分割區一是空的。如果要將資料完整、平均的放到四個分割區,那就得調整一下 Partition Function 中的切割點囉。
~ End
後記:Partition 還可以做 Partition 之間的 Switch、Merge、Split,這些動作因為只會動到標記,不會真實移動資料,所以可以很快的完成。
後記2:本篇並無提到怎麼寫 Partition Function 與 Partition Scheme,這是因為這2項牽扯真正要處理的資料欄位、方式,所以不多做解釋。請參考
Partition Function III
Partition Scheme III
SQL 2008 Online Book 中English
T-SQL: http://blog.xuite.net/tolarku/blog/42149880 

沒有留言:

張貼留言