更改 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]
我有大约 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]