2009年5月20日 星期三

SQL 2005 資料分割 (Partition)

SQL 2005 資料分割 (Partition)

想要對資料表進行切割動作,翻閱一下 SQL 的線上說明文件,在 create table 陳述式裡可以找到這一段 :

CREATE TABLE
    [ database_name . [ schema_name ] . | schema_name . ] table_name
        
( { <column_definition> | <computed_column_definition> }
     [ <table_constraint> ] [ ,...n ] ) 
[ ON { partition_scheme_name ( partition_column_name ) | filegroup
| "default" } ]
[ { TEXTIMAGE_ON { filegroup | "default" } ]
[ ; ]


可以注意黃色醒目背景的地方,在 CREATE TABLE 指令就可以設定資料分割的動作了。

ON { partition_scheme_name ( partition_column_name ) }
裡面的 partition_scheme_name ,是指當我們如果需要建立一個切割資料表時,
需要明確定義這個資料表是要根據何種方式來切割。而這個定義,稱為 partition schema
也就是說,資料切割只需要在 create table 指令加上 partition schema 的名稱就可以了。

此外,也要宣告一個切割時所要依據的欄位。譬如說,你希望未來資料切割方式是根據你的日期欄位來切,
2007 年 放一塊,2008 年放一塊 ,2009年放一塊,那就要將日期欄位指定為切割所依據的欄位了
(partition_column_name )。

很可惜,事情不是這樣就結束了。因為殺出一個程咬金 partition schema 出來,那要怎麼去產生這個
partition schema 呢?

也是一樣,翻一下SQL 的線上說明文件,在 create partition schema 說明裡,有以下一段:


CREATE PARTITION SCHEME partition_scheme_name
AS PARTITION partition_function_name
[ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )
[ ; ]


原來,要產生 partition schema ,有兩個步驟要做,
第一:產生 partition function
第二:指定 file group

首先,產生 partition function。線上說明文件有提到:

CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type )
AS RANGE [ LEFT | RIGHT ]
FOR VALUES ( [ boundary_value [ ,...n ] ] )
[ ; ]

input_parameter_type:
是指用來切割時依據欄位的資料格式,如果是用日期的話,這裡就要用 datetime
boundary_value:
是指切割的臨界值。如果希望將資料切割成 2007年 、 2008年 、2009年 三份的話,就必須切兩次,依據  20080101  與 20090101  就可以讓資料依年度分為三類,而boundary_value 就是指20080101 與 20090101。當然,因為是屬於datetime 欄位,所以實際上我們要將輸入的參數轉型為適當型別。以我們的範例來說,就需要改成  convert(datetime,'2008 01 01'), convert(datetime,'2009 01 01')
LEFT | RIGHT:
剛剛有提到的臨界值,如果這麼恰巧,有一個日期  就是 20080101  ,那我們會希望這臨界值放在臨界值左邊還是右邊?就要用 LEFT 或 RIGHT 來設定。以我們的範例,20080101 當然是希望放在他的右邊囉,因為它的左邊都是 2007 年的,右邊才是 2008 年。


接著,產生 file group。
我們嘴裡喊著要將資料表做切割,雖然表面上看起來,我們存取的是一個資料表,但實際上,因為我們的切割,他會根據我們切割的
規則而分別存放在各個檔案裡。以我們的範例來說,根據 20080101 與 20090101 的分割法則,會產生三個資料區塊:
資料<2008 ,  2008<= 資料  < 2009 , 2009<=資料 。實際上,就需要產生三個不同的檔案來存放。而每個檔案要對應一個檔案群組,
所以我們同時也需要產生一個檔案群組給每一個檔案。

產生檔案群組方式:

ALTER DATABASE TestDB ADD FILEGROUP fg_date_1 

很簡單,只要  ADD FILEGROUP 就可以了。


產生檔案的方式:

ALTER DATABASE TestDB  
ADD FILE  
( NAME = TDate1, 
 FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\TranDate1.ndf', 
 SIZE = 1MB, 
 MAXSIZE = 100MB, 
 FILEGROWTH = 1MB) 
TO FILEGROUP fg_date_1 


NAME 是指定檔案的名稱
FILENAME 是檔案實體名稱,預設都會放在c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\ 下面,後面就是我們自己對實體檔案的命名
FILEGROUP 是指定對應的檔案群組


當我們完成上述所有步驟之後,就可以產生一個具有分割特性的資料表。以後所有 insert 到這資料的資料,就會根據分割原則存放在所分配的實體檔案裡。





沒有留言:

張貼留言