不能。SWITCH PARTITION仅交换分区元数据,不移动或删除数据;归档需配合预建结构对齐的空归档表及后续清理,且须满足同库、同文件组、结构一致、归档表为空四大条件。

SWITCH PARTITION 能不能直接归档历史数据?
不能。SWITCH PARTITION 本身不移动数据、不删除数据,也不写入新表;它只是快速交换分区元数据(比如将一个分区从主表“切”到空的归档表中)。真正完成归档,必须配合提前建好的归档表结构 + 分区对齐 + 事后清理逻辑。
执行 SWITCH 前必须满足的 4 个硬性条件
缺一不可,否则报错 The ALTER TABLE SWITCH statement failed:
- 源分区表和目标归档表必须在同一个数据库、同一文件组(或都启用
DATA_COMPRESSION且压缩设置一致) - 两表结构完全一致:列名、顺序、类型、NULL 性、排序规则、约束(但主键/索引可不同)
- 归档表必须为空,且已按相同分区函数和方案创建(即用
CREATE TABLE ... ON [ps_archive](partition_col)) - 源分区当前不能处于正在拆分(
SPLIT)或合并(MERGE)过程中
典型归档流程:三步不可颠倒
以按月分区的 sales_order 表为例,归档 2022 年及以前数据:
1. 准备归档表
CREATE TABLE sales_order_archive (
order_id INT,
order_date DATE,
amount DECIMAL(10,2)
) ON ps_archive(order_date);2. 切换最老分区(假设是第 1 分区)
ALTER TABLE sales_order SWITCH PARTITION 1 TO sales_order_archive PARTITION 1;
3. 清理旧分区边界(可选但推荐)
执行 ALTER PARTITION FUNCTION pf_date() MERGE RANGE ('2023-01-01');,让主表不再维护已归档的时间段。
容易被忽略的陷阱:切换后数据还在原位置?
是的——SWITCH 只改元数据指针,物理数据页不会搬动。这意味着:
- 归档表里的数据仍占用原文件组空间,需手动
DBCC SHRINKFILE(不建议频繁用)或后续重建归档表并压缩 - 若归档表建在只读文件组,切换会失败;必须确保目标文件组可写
- 切换后立刻查
sys.partitions,确认rows已从主表对应分区清零,且归档表分区行数匹配
真正省时间的是元数据操作,不是 I/O;别指望它“加速导出”,它加速的是“逻辑下线”。










