[点晴永久免费OA]SQL Server 2008以上版本普通表和分区表之间切换数据(分区交换)
SQL Server分区切换(Partition Switching也叫分区交换)是一种高效的元数据操作,用于在普通表与分区表的指定分区之间快速转移数据,适合历史数据的快速迁移维护操作。其实Oracle等其它数据库也具备相似功能,原理大同小异。
结构一致性:表结构(包括聚簇索引、非聚集索引、约束)必须相同。
分区对齐:切换到分区表时,普通表的数据必须完全符合目标分区的分区键范围。
索引对齐:如果分区表有对齐索引,普通表也需建立相同索引。
约束要求:普通表需添加 CHECK约束,限制分区键范围与目标分区一致(分区切换时 SQL Server 会检查约束)。
操作期间会获取架构锁,但数据不移动,仅修改元数据,所以比insert into等迁移数据的方法快很多。


-- 1. 创建普通表CREATE TABLE dbo.Sales ( SaleID INT PRIMARY KEY,--主键不一致问题 SaleDate DATE, Amount DECIMAL(10,2));-- 2. 插入测试数据(假设数据集中在 2024-01-01 至 2024-01-31)INSERT INTO dbo.Sales VALUES (1, '2024-01-15', 100), (2, '2024-01-20', 200);select * from dbo.Sales;-- 3. 创建分区函数和方案CREATE PARTITION FUNCTION pf_Monthly (DATE) AS RANGE RIGHT FOR VALUES ('2024-02-01', '2024-03-01'); -- 两个分界点CREATE PARTITION SCHEME ps_Monthly AS PARTITION pf_Monthly ALL TO ([PRIMARY]);-- 4. 创建分区表(结构同 Sales)CREATE TABLE dbo.Sales_Partitioned ( SaleID INT, SaleDate DATE, Amount DECIMAL(10,2)) ON ps_Monthly(SaleDate);-- 5. 在 Sales 表上添加 CHECK 约束,确保数据在第一个分区范围内ALTER TABLE dbo.Sales ADD CONSTRAINT CK_Sales_SaleDate CHECK (SaleDate < '2024-02-01');-- 6. 切换数据到分区表的第一个分区ALTER TABLE dbo.Sales SWITCH TO dbo.Sales_Partitioned PARTITION 1;select * from dbo.Sales_Partitioned;-- 7. 切换分区表第一个分区数据到普通表ALTER TABLE dbo.Sales_Partitioned SWITCH PARTITION 1 TO dbo.Sales;select * from dbo.Sales_Partitioned;select * from dbo.Sales;