SQL Server分區表實踐

建立分區表的步驟:

新建文件組(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

这里写图片描述

猜你喜欢

转载自blog.csdn.net/benjayming/article/details/80387148