首先要說明的是, 當然可以建立一個新的 partition table 後, 利用 insert into xxxx select xxx from xxx 的方式將舊table (無partition的)轉移到 partition table 上後, 再利用 sp_rename 的方式, 將兩個 table 改名也可以完成. 但如何"直接"做到在原 table 上達成這件事, 將是本文的探討範圍. (新建的方式可以參考這篇資料: http://www.blueshop.com.tw/board/show.a ... 6152735ZFS)
我們先來建立 lab 吧, 首先當然就是建個資料表, 並且塞入一些資料, 如下:
代碼: 選擇全部
--create table
create table tblUsers
(sid int primary key, username nvarchar(50), birthday datetime)
--insert data
INSERT tblUsers (sid, username, birthday) VALUES (1, N'jack', '1980-02-03 00:00:00.000')
INSERT tblUsers (sid, username, birthday) VALUES (2, N'tim', '1992-01-17 00:00:00.000')
INSERT tblUsers (sid, username, birthday) VALUES (3, N'tom', '1988-03-07 00:00:00.000')
INSERT tblUsers (sid, username, birthday) VALUES (4, N'max', '1966-02-01 00:00:00.000')
INSERT tblUsers (sid, username, birthday) VALUES (5, N'mary', '1992-03-15 00:00:00.000')
INSERT tblUsers (sid, username, birthday) VALUES (6, N'kenny', '1987-06-05 00:00:00.000')
INSERT tblUsers (sid, username, birthday) VALUES (7, N'mag', '1994-05-12 00:00:00.000')
INSERT tblUsers (sid, username, birthday) VALUES (8, N'john', '1995-03-07 00:00:00.000')
INSERT tblUsers (sid, username, birthday) VALUES (9, N'david', '1976-03-05 00:00:00.000')
--select to check if data is ready
select * from tblUsers
代碼: 選擇全部
create partition function pf_DateRange (datetime)
as range right for values ('1980/1/1', '1990/1/1')
代碼: 選擇全部
ALTER DATABASE bb ADD FILEGROUP fg1
ALTER DATABASE bb ADD FILE (NAME = 'fg1', FILENAME = 'D:SQLDatabb_fg1.NDF') TO FILEGROUP fg1
ALTER DATABASE bb ADD FILEGROUP fg2
ALTER DATABASE bb ADD FILE (NAME = 'fg2', FILENAME = 'D:SQLDatabb_fg2.NDF') TO FILEGROUP fg2
ALTER DATABASE bb ADD FILEGROUP fg3
ALTER DATABASE bb ADD FILE (NAME = 'fg3', FILENAME = 'D:SQLDatabb_fg3.NDF') TO FILEGROUP fg3
代碼: 選擇全部
select * from sysfiles
再來的 partition schema 就可以建立了, 如下:
代碼: 選擇全部
CREATE PARTITION SCHEME ps_DateRange
AS PARTITION pf_DateRange
to (fg1, fg2, fg3)
代碼: 選擇全部
select * from tblUsers
代碼: 選擇全部
alter table tblusers DROP CONSTRAINT PK__tblUsers__7F60ED59 WITH (MOVE TO ps_DateRange (birthday))
代碼: 選擇全部
select *, $PARTITION.pf_DateRange(birthday) from tblUsers
建立要注意 primary key 為 non-clustered index 才可以哦, 因為已經是 partition table 了, 所以不能再有 clustered index 來影響 partition table 的存放, 所以 primary key 建立方式如下:
代碼: 選擇全部
ALTER TABLE dbo.tblUsers ADD CONSTRAINT PK_tblUsers PRIMARY KEY NONCLUSTERED (sid) ON [PRIMARY]
代碼: 選擇全部
SELECT ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] = OBJECT_ID('tblUsers')
是不是很容易呢? 但若是要還原回來或是加入新的 filegroup 利用 split 指令或是合併兩個區間的 merge 指令, 都可以再試看看囉, 之後有時間再來整理囉!