專案後期資料突破 1000 萬筆,索引已建、查詢仍超時。分庫因關聯表過多、一對多關係複雜難以實施。發現 SQL Server 2005 表分區功能:邏輯上仍是單一表,物理上將資料依範圍分散至多個檔案群組/磁碟,查詢自動路由至相關分區,大幅降低掃描範圍。
ALTER DATABASE [D] ADD FILEGROUP [GF1];
ALTER DATABASE [D] ADD FILE (
NAME = N'GF1',
FILENAME = N'E:\D\D1\DGF1.ndf',
SIZE = 5MB,
FILEGROWTH = 10%
) TO FILEGROUP [GF1];
CREATE PARTITION FUNCTION [D_PARTITIONFUNC] (int)
AS RANGE LEFT FOR VALUES (200000, 400000, 500000);
RANGE LEFT 表示邊界值屬於左側分區。上例產生 4 個分區:ID ≤ 200000、200000 < ID ≤ 400000、400000 < ID ≤ 500000、ID > 500000。
CREATE PARTITION SCHEME [D_PARTITION_SCHEME]
AS PARTITION [D_PARTITIONFUNC]
TO ([PRIMARY], [GF1], [PRIMARY], [GF1]);
依序對應 4 個分區至檔案群組,實現多磁碟分佈。
ALTER TABLE dbo.B DROP CONSTRAINT [PK_B];
ALTER TABLE dbo.B ADD CONSTRAINT [PK_B] PRIMARY KEY CLUSTERED (ID)
ON [D_PARTITION_SCHEME](ID);
完成後,表 B 依 ID 自動分區儲存。查詢時優化器自動消除無關分區,百萬級甚至百億級資料查詢效能大幅提升。
ALTER PARTITION FUNCTION ... SPLIT/MERGE RANGE。SELECT * FROM sys.partitions WHERE object_id = OBJECT_ID('dbo.B')。SWITCH 快速移出最舊分區。ON partition_scheme(col)。