- 使用 Disk Array(當然大家都會將資料庫放到磁碟陣列中)
- 使用更快的硬碟、更快的 CPU、更好的 Server(當然硬體規格越優越好囉)
- 針對該資料表常被 Query、Join 的欄位 (Column) 做索引 (Index)
- 還有呢?
但是?單一 Table 超大時,卻無法單純的因為多了幾個 ndf 就飛快了起來
怎麼辦?
※當某資料表連做索引都無法有效提昇效能時,可以利用 Partition 將資料表內容分割到多個檔案群組去,以加快存取速度。
Partition Table 建立步驟
- 建立DB、Table、File Group(s)、設定FG的檔案位置、大小、最大空間使用限制、每次成長量(這些是基本的設定值)
- 建立 Partition Function (PF):定義被切割欄位的屬性與切割點(例如:Datetime 就以日期來做為切割)
\\SSMS\Database\Storage\Partition Functions\ - 建立 Partition Scheme (PS):將檔案群組(FG) 加入到剛剛建立的 Partition Function
- 若是運用在新建立的 Table 上
CREATE TABLE tbl_xxx
( tid int IDENTITY(1,1) NOT NULL
....... )
ON ps_xxx
表示套用 Partition Scheme ps_xxx 來做為儲存此 Table 的方式
Table 的資料內容使用不同的檔案群組,不但可以加快 Disk I/O ,更能減少被 Data Lock 的機會。
-------------------------------------------
QQ:已經存在的資料表怎麼套用 Partition Scheme?
A:
- 當然你可以單純的建立一個新的 Table ,並先套用好 Partition Scheme ,接著將原本的資料以 Select Into 方式逐筆插入,最後再改個 Table Name 就ok了。
- 使用圖形介面,以SSMS 來實作
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 I 、 II
Partition Scheme I 、 II
SQL 2008 Online Book 中、English
T-SQL: http://blog.xuite.net/tolarku/blog/42149880
沒有留言:
張貼留言