建立分區表的步驟:
新建文件組(FileGroups)
新建用於承載具體分區的文件組,數據庫默認有只有一個Primary文件組
USE [master]
GO
ALTER DATABASE [TestDB_20170705] ADD FILEGROUP [TestDB_FG_1]
GO
ALTER DATABASE [TestDB_20170705] ADD FILEGROUP [TestDB_FG_2]
GO
-- 增加文件組-物理文件
ALTER DATABASE [TestDB_20170705]
ADD FILE
(
NAME = TestDB_FG_1,
FILENAME = 'E:\DB-File\TestDB_FG_1.ndf',
SIZE = 5MB,
FILEGROWTH = 5MB
)
TO FILEGROUP [TestDB_FG_1];
GO
ALTER DATABASE [TestDB_20170705]
ADD FILE
(
NAME = TestDB_FG_2,
FILENAME = 'E:\DB-File\TestDB_FG_2.ndf',
SIZE = 5MB,
FILEGROWTH = 5MB
)
TO FILEGROUP [TestDB_FG_2];
GO
創建 分區函數(Partition Function)
分區函數用於決定分區表中數據如何對應到具體的分區
-- 代表以20000為分界點,實際也可以聲明多個分界點
-- Left表示 <= 20000,即20000存儲在分界點左邊分區
CREATE PARTITION FUNCTION MyPF_Test(INT)
AS RANGE LEFT FOR VALUES (20000)
GO
創建 分區方案(Partition Scheme)
根據分區函數將表中數據Map到具體的文件組
-- 分區函數有N個分界點,則引用它的分區方案有N+1個文件組
-- 分區列<=20000的數據放在默認的Primary文件組,其餘的放在TestDB_FG_1文件組
CREATE PARTITION SCHEME myPS_Test
AS PARTITION MyPF_Test TO ([PRIMARY],TestDB_FG_1)
GO
創建 分區表(Partition Table)
- 新建分區表
在創建表時定義分區方案,這個根據EID的值進行分區
CREATE TABLE TestEmp
(
EID INT,
Name NVARCHAR(200),
JoinDate DATETIME
)
ON MyPF_Test(EID)
- 將非分區表轉換為分區表
可以先備份原表數據,Drop原表,再將數據插回來。
若不想這麼麻煩,可以直接重建索引來實現。
若表存在聚集索引,則分區列必須為聚焦索引的一部分。
下面將Employee(以EID為主鍵)表轉換為分區表:
-- 移除主鍵約束(SQL會同步移除聚焦索引)
ALTER TABLE [dbo].[Employee] DROP CONSTRAINT [PK_Employee]
GO
-- 重新創建分區索引
ALTER TABLE [dbo].[Employee] ADD CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED ([EID]) ON myPS_Test(EID)
GO
分區表元數據查詢
-- 分區表數據分佈情況
SELECT OBJECT_NAME(i.object_id) AS ObjectName
,c.name AS PartitioningColumn
,CONVERT(VARCHAR(50), ps.name) AS partition_scheme
,p.partition_number
,CONVERT(VARCHAR(10), ds2.name) AS filegroup
,CONVERT(VARCHAR(19), ISNULL(v.value, ''), 120) AS range_boundary
,p.rows
,df.physical_name AS DatabaseFileName
FROM sys.indexes i
JOIN sys.partition_schemes ps ON i.data_space_id = ps.data_space_id
JOIN sys.destination_data_spaces dds ON ps.data_space_id = dds.partition_scheme_id
JOIN sys.data_spaces ds2 ON dds.data_space_id = ds2.data_space_id
JOIN sys.partitions p ON dds.destination_id = p.partition_number AND p.object_id = i.object_id AND p.index_id = i.index_id
JOIN sys.partition_functions pf ON ps.function_id = pf.function_id
JOIN sys.database_files df ON df.data_space_id = ds2.data_space_id
JOIN sys.index_columns AS ic ON ic.[object_id] = i.[object_id] AND ic.index_id = i.index_id AND ic.partition_ordinal >= 1
JOIN sys.columns AS c ON i.[object_id] = c.[object_id] AND ic.column_id = c.column_id
LEFT JOIN sys.partition_range_values v ON pf.function_id = v.function_id AND v.boundary_id = p.partition_number - pf.boundary_value_on_right
WHERE i.index_id IN (0, 1)
ORDER BY ObjectName
,partition_number