更改 table 的文件组的有效方法

Efficient way to change the table's filegroup

我有大约 300 个 table 位于不同的分区中,现在这些 table 不再像以前那样用于存储如此庞大的数据。现在,我不时收到 space 问题,其中一些但有价值的 space 被为这些 table 创建的 150 个文件组占用,所以我想更改 table 的文件组到任何一个而不是 150 FG,并通过删除这些文件组来释放 space。

仅供参考:这些 table 现在没有保存任何数据,但定义了许多约束和索引。

你能给我建议吗,如何才能有效地完成它?

要移动 table,删除并重新创建指定新 FG 的聚簇索引。如果它没有聚集索引,请创建一个然后删除它。

最好不要将用户数据保存在主 FG 上。将其留给系统对象,并将您的数据放在其他文件组中。但是很多人忽略了这一点...

我找到了一些关于更改现有 table 的 FG 组的方法的更多信息:

1- 使用 NEW_FG 在每个对象中定义聚簇索引(在@under answer 中提到)

CREATE UNIQUE CLUSTERED INDEX <INDEX_NAME> ON dbo.<TABLE_NAME>(<COLUMN_NAME>) ON [FG_NAME]

2- 如果我们不能定义聚簇索引,那么将 table 和数据结构复制到新的 table,删除旧的并将新的重命名为旧的,如下所示

将数据库的默认 FG 更改为 NEW_FG,这样每个 table 都可以使用 INTO 创建,默认情况下在新 FG 下

ALTER DATABASE <DATABASE> MODIFY FILEGROUP [FG_NAME] DEFAULT

IF OBJECT_ID('table1') IS NOT NULL 
BEGIN
    SELECT * INTO table1_bkp FROM table1
    DROP TABLE table1
    EXEC sp_rename table1_bkp, table1
END

所有操作完成后数据库的默认FG和以前一样

ALTER DATABASE <DATABASE> MODIFY FILEGROUP [PRIMARY] DEFAULT

3- 如果可行,删除 table 然后使用 NEW_FG

重新创建它
DROP TABLE table1 
CREATE TABLE [table1] ( 
    id int,
    name nvarchar(50),
    --------
) ON [NEW_FG]