表分區是 SQL Server 2005 引入的一項企業級功能,它將大型資料表或索引在邏輯上劃分為多個較小、更易管理的單元,稱為分區。每個分區可以獨立存儲在不同的文件組上,甚至分佈在不同的物理磁碟上,從而實現資料的水平切分。對於應用程式而言,分區表在邏輯上仍是一張完整的表,查詢和維護操作無需修改代碼即可透明受益。
CREATE PARTITION FUNCTION pf_OrderDate (DATETIME)
AS RANGE RIGHT FOR VALUES (
'2023-01-01', '2023-04-01', '2023-07-01', '2023-10-01'
);
定義分區邊界值,採用 RANGE RIGHT 表示邊界值屬於右側分區。
CREATE PARTITION SCHEME ps_OrderDate
AS PARTITION pf_OrderDate
TO (fg_Q1, fg_Q2, fg_Q3, fg_Q4, fg_History);
將各分區映射到預先建立的文件組,建議每個文件組位於獨立磁碟。
CREATE TABLE Sales.Orders (
OrderID BIGINT IDENTITY,
OrderDate DATETIME NOT NULL,
CustomerID INT,
Amount MONEY,
CONSTRAINT PK_Orders PRIMARY KEY (OrderID, OrderDate)
) ON ps_OrderDate (OrderDate);
注意:分區欄位必須包含在主鍵中,且為分區函數的輸入參數類型。
-- 建立暫存表,結構與目標分區完全一致
CREATE TABLE Sales.Orders_Staging (...) ON fg_Q1;
-- 載入新資料至暫存表
INSERT INTO Sales.Orders_Staging ...;
-- 秒級切換:元數據操作,無資料移動
ALTER TABLE Sales.Orders_Staging SWITCH TO Sales.Orders PARTITION 1;
所有非叢集索引建議採用相同分區配置(對齊索引),確保分區切換操作不受阻礙:
CREATE NONCLUSTERED INDEX IX_Orders_CustomerID
ON Sales.Orders (CustomerID) ON ps_OrderDate (OrderDate);
定期檢視分區統計資訊:
SELECT
OBJECT_NAME(p.object_id) AS TableName,
p.partition_number,
fg.name AS FileGroup,
p.rows AS RowCount,
au.total_pages * 8 / 1024.0 AS SizeMB
FROM sys.partitions p
JOIN sys.allocation_units au ON p.hobt_id = au.container_id
JOIN sys.filegroups fg ON au.data_space_id = fg.data_space_id
WHERE p.object_id = OBJECT_ID('Sales.Orders');
UPDATE STATISTICS。SQL Server 2005 的表分區功能為大規模資料管理提供了強大支援,合理規劃分區策略能顯著提升系統擴展性與維護效率。建議在正式環境部署前,於測試環境模擬真實負載進行壓力驗證。