sql server自2005開始支持分區特性,2012 以前單表分區數量限制1000個,2012開始限制數量為15000個,企業版才支分區特性,目前版本只支持范圍分區一種,相比oracle 支持范圍、列表、哈希以及子分區特性,功能還有不少的差距。
一、表分區的優勢:
1、通過分區交換快速歸檔、清理歷史數據,降低表數據量提升表訪問性能;
2、通過分區裁決特性,當查詢條件包含分區依據列時優化器可以直接跳過不包括條件數據的分區,降低io 提升查詢速度;
3、當查詢操作的數據位於某一分區時,sql server 可以只對該分區加鎖而不用鎖定全表,提升了表的並發性能
二、將普通表轉換為分區表的方式:
1、新建新的空分區表采用insert into 插入數據方式
2、SSMS 創建分區向導方式
3、普通表上創建聚集分區索引方式
--唯一鍵索引分區限制條件
唯一聚集和非聚集分區索引必須包含分區列
三、分區交換進行大表數據遷移:
1、分區表taba分區數據切換到分區表tabb分區中
alter table dbo.taba partition 1 switch to dbo.tabb partition 1
alter table dbo.taba partition 2 switch to dbo.tabb partition 2
alter table dbo.taba partition 3 switch to dbo.tabb partition 3
2、分區表taba分區數據切換到非分區表tabb中
alter table dbo.taba partition 1 switch to dbo.tabb
3、非分區表tabb中數據切換到分區表taba分區中
ALTER TABLE dbo.tabb SWITCH TO dbo.taba PARTITION 1
--限制條件
分區表之間的分區切換必須是相同的表結構、索引,分區函數與分區架構必須一致
分區表分區到普通表之間的切換必須是相同的表結構、索引,普通表與待切換的分區表分區位於相同的文件組
普通表到分區表分區之間的切換必須是相同的表結構、索引,普通表與待切換的分區表分區位於相同的文件組,普通表存在與待交換分區分區鍵數據范圍一致的check約束
四、分區操作:
1、創建分區函數
CREATE PARTITION FUNCTION [Func_Intime](datetime) AS RANGE LEFT FOR VALUES (N'2021-09-10T00:00:00.000', N'2021-12-10T00:00:00.000', N'2021-12-11T00:00:00.000', N'2021-12-12T00:00:00.000', N'2021-12-13T00:00:00.000', N'2021-12-14T00:00:00.000', N'2021-12-15T00:00:00.000', N'2021-12-16T00:00:00.000')
2、創建分區架構
CREATE PARTITION SCHEME [SCH_Intime] AS PARTITION [Func_Intime] TO ([FGLOG1], [FGLOG2], [FGLOG3], [FGLOG4], [FGLOG5], [FGLOG6], [FGLOG7], [FGLOG8], [FGLOG9])
3、創建分區表
create TABLE TABLE_name (col1 int, col2 varchar(100),col3 datetime,col4 nvarchar(10),
CONSTRAINT pk_col4 PRIMARY KEY NONCLUSTERED
(
col4,
col3
)
)
on SCH_Intime(col3);
4、創建與表對齊的分區索引
CREATE NONCLUSTERED INDEX [col1_idx] ON [dbo].[table_name]
(
col1
) on SCH_Intime(col3);
5、將主鍵索引分區,主鍵必須包括分區依據列
alter table TABLE_name drop CONSTRAINT pk_col4;
ALTER TABLE TABLE_name ADD
CONSTRAINT pk_col4 PRIMARY KEY NONCLUSTERED
(
col4,
col3
)
on SCH_Intime(col3);
6、將分區表的鎖升級粒度調整為分區級而不用鎖全表,提升分區表的並發性能
ALTER TABLE TABLE_name SET (LOCK_ECALATION = AUTOT);
LOCK_ECALATION 有三個值,默認為TABLE:無能表是否分區,當發生鎖升級時始終升級到表鎖;
AUTO:當表為普通表時鎖升級升級至表鎖,如表為分區表時鎖升級升級至分區鎖;
DISABLE:在大多數情況下禁用表的鎖升級,表級別的鎖完全禁止。
7、表分區合並
ALTER PARTITION FUNCTION Func_Intime() MERGE RANGE (N'2021-09-10T00:00:00.000')
8、表分區擴充
ALTER PARTITION SCHEME SCH_Intime NEXT USED FGLOG10;
ALTER PARTITION FUNCTION Func_Intime() SPLIT RANGE (N'2021-12-17T00:00:00.000');
9、truncate 分區數據,sql server 2016 開始支持
TRUNCATE TABLE TABLE_name
WITH(Partitions(1,2)) ; --清空1、2號分區數據
10、查詢分區表上各個分區上的數據行數
SELECT $PARTITION.Func_Intime(datetime) AS Partition,
COUNT(*) AS [COUNT] FROM dbo.TABLE_name
GROUP BY $PARTITION.Func_Intime(datetime)
ORDER BY Partition ;