Azure专用SQL池:将小型聚集列存储索引表改为堆表
将Azure专用SQL池中的CCI表改为堆表的方法
首先明确:无法通过简单的ALTER语句直接将聚集列存储索引(CCI)表修改为堆表,Azure专用SQL池不支持这种直接修改操作,需要通过重建表的方式实现,具体方案如下:
方案一:分步创建堆表并迁移数据
- 复制原表结构创建空堆表,指定
WITH (HEAP)选项:
CREATE TABLE dbo.NewHeapTable WITH (HEAP) AS SELECT * FROM dbo.ExistingCCITable WHERE 1=0; -- 仅复制表结构,不导入数据
- 将原表数据插入新堆表:
INSERT INTO dbo.NewHeapTable SELECT * FROM dbo.ExistingCCITable;
- 验证数据无误后,替换原表(可选,保持表名不变):
-- 重命名原表为备份表 EXEC sp_rename 'dbo.ExistingCCITable', 'dbo.OldCCITable'; -- 将新堆表重命名为原表名 EXEC sp_rename 'dbo.NewHeapTable', 'dbo.ExistingCCITable';
- 确认业务正常后,删除旧的CCI备份表:
DROP TABLE dbo.OldCCITable;
方案二:用CTAS直接创建带数据的堆表
这是更高效的方式,一步完成结构复制和数据迁移:
CREATE TABLE dbo.NewHeapTable WITH (HEAP) AS SELECT * FROM dbo.ExistingCCITable;
完成后可通过重命名替换原表,或直接使用新表开展业务。
注意事项
- 操作前务必备份原表数据,防止意外丢失
- 原表的索引、主键/外键等约束,需要在新堆表上重新创建
- 针对超大型表,建议分批次迁移数据,避免占用过多资源影响其他业务
内容的提问来源于stack exchange,提问作者Saurabh Mehta
相关产品推荐
相关产品推荐

