更改表格文件组的有效方法

时间:2016-12-02 09:03:24

标签: sql sql-server partitioning filegroup

我有大约300个表位于不同的分区,现在这些表没有用于如此庞大的数据。现在,我不时地获得空间问题,并且为这些表创建的150个文件组占用了一些宝贵的空间,因此我想将表的文件组更改为任何一个而不是150 FG并释放空间删除这些文件组。

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

您能否建议我,如何有效地完成工作?

2 个答案:

答案 0 :(得分:1)

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

最佳做法是不将用户数据保留在主FG上。保留系统对象,并将数据放在其他文件组中。但是很多人都忽略了这一点......

答案 1 :(得分:0)

我发现有关更改现有表的FG组的方法的更多信息:

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

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

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

将数据库的默认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]