我有大约 300 个表,它们位于不同的分区中,现在这些表不再用于存储如此庞大的数据。现在,我不时遇到空间问题,其中一些但有价值的空间被为这些表创建的 150 个文件组占用,所以我想将表的文件组更改为任何一个而不是 150 FG,并通过删除这些文件组来释放空间.
仅供参考:这些表现在不包含任何数据,但定义了许多约束和索引。
您能否建议我,如何有效地完成它?
我有大约 300 个表,它们位于不同的分区中,现在这些表不再用于存储如此庞大的数据。现在,我不时遇到空间问题,其中一些但有价值的空间被为这些表创建的 150 个文件组占用,所以我想将表的文件组更改为任何一个而不是 150 FG,并通过删除这些文件组来释放空间.
仅供参考:这些表现在不包含任何数据,但定义了许多约束和索引。
您能否建议我,如何有效地完成它?
要移动表,删除然后重新创建它的聚集索引,指定新的 FG。如果它没有聚集索引,则创建一个然后删除它。
最佳做法是不要将用户数据保留在主 FG 上。将其留给系统对象,并将您的数据放在其他文件组中。但是很多人都忽略了这个...
我发现了一些关于更改现有表的 FG 组的方法的更多信息:
1- 使用 NEW_FG 在每个对象中定义聚集索引(在@under 答案中提到)
CREATE UNIQUE CLUSTERED INDEX <INDEX_NAME> ON dbo.<TABLE_NAME>(<COLUMN_NAME>) ON [FG_NAME]
2-如果我们无法定义聚集索引,则将表和数据结构复制到新表,删除旧表并将新表重命名为旧表,如下所示
将数据库的默认 FG 更改为 NEW_FG,以便可以使用 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- 如果可行,删除表,然后使用 NEW_FG 再次创建它
DROP TABLE table1
CREATE TABLE [table1] (
id int,
name nvarchar(50),
--------
) ON [NEW_FG]