我如何将表移动到另一个文件组?

use*_*887 59 sql-server filegroup sql-server-2008

我有两个大表的SQL Server 2008 Ent和OLTP数据库.如何在不中断服务的情况下将此表移动到另一个文件组?现在,在此表中,每秒插入约100-130条记录和30-50条记录.每个表有大约100M记录和六个字段(包括一个字段地理).

我通过谷歌寻找解决方案,但所有解决方案都包含"创建第二个表,从第一个表插入行,删除第一个表,bla bla bla".

我可以使用分区功能来解决这个问题吗?谢谢.

mar*_*c_s 76

如果只想将表移动到新文件组,则需要在所需的新文件组上重新创建表上的聚簇索引(毕竟:聚簇索引表数据).

您可以使用例如:

CREATE CLUSTERED INDEX CIX_YourTable
   ON dbo.YourTable(YourClusteringKeyFields)
   WITH DROP_EXISTING
   ON [filegroup_name]
Run Code Online (Sandbox Code Playgroud)

或者如果您的聚集索引是唯一的:

CREATE UNIQUE CLUSTERED INDEX CIX_YourTable
   ON dbo.YourTable(YourClusteringKeyFields)
   WITH DROP_EXISTING
   ON [filegroup_name]
Run Code Online (Sandbox Code Playgroud)

这将创建一个新的聚簇索引并删除现有聚簇索引,并在您指定的文件组中创建新的聚簇索引 - 等等,您的表数据已移至新文件组.

有关您可能要指定的所有可用选项的详细信息,请参阅CREATE INDEX上MSDN文档.

这当然还没有处理分配问题,但这完全是另一个故事......

  • 很好的废话...我只花了更多的时间来承认试图弄清楚为什么我在FILEGROUP2上创建的表继续使用FILEGROUP1 ...这是因为PK在FG1`create table(... FG1上的约束(...)ON FG2` - FG1优先.谢谢你. (10认同)
  • 并非所有表都是聚簇索引.刚刚从谷歌开始尝试找到相同的信息. (3认同)
  • 对于那些谈论堆的人 - 你可以创建一个聚集索引来强制移动,然后再删除聚集索引?应该完成相同的结果. (2认同)
  • @WernerCD“糟糕透顶”这简直让我发笑。谢谢,我需要那个。:-) (2认同)

Bao*_*dad 26

要回答这个问题,首先我们必须明白

  • 如果表没有索引,则其数据称为
  • 如果表具有聚簇索引,则该索引实际上是您的表数据.因此,如果移动聚簇索引,您还将移动数据.

第一步是找到有关我们要移动的表的更多信息.我们通过执行这个T-SQL来做到这一点:

sp_help N'<<your table name>>'
Run Code Online (Sandbox Code Playgroud)

输出将显示标题为"Data_located_on_filegroup"的列.这是了解表数据所在的文件组的便捷方法.但更重要的是输出显示有关表索引的信息.(如果您只想查看有关表索引的信息,只需运行sp_helpindex N'<<your table name>>')您的表可能有1)没有索引(因此它是堆),2)单个索引,或3)多个索引.如果index_description以'clustered,unique,...'开头,那就是您要移动的索引.如果索引也是主键,那就没问题,你仍然可以移动它.

要移动索引,请记下上面帮助查询结果中显示的index_name和index_keys,然后使用它们填写<<blanks>>以下查询:

CREATE UNIQUE CLUSTERED INDEX [<<name of clustered index>>]
ON [<<table name>>]([<<column name the index is on - from index_keys above>>])
WITH DROP_EXISTING, ONLINE
ON <<name of file group you want to move the index to>>
Run Code Online (Sandbox Code Playgroud)

以上DROP EXISTING, ONLINE选项很重要. DROP EXISTING确保索引不重复,并ONLINE在移动表时保持表在线.

如果您正在移动的索引不是聚簇索引,则将UNIQUE CLUSTERED上面的替换为NONCLUSTERED

要移动堆表,请向其添加聚簇索引,然后运行上述语句将其移动到其他文件组,然后删除索引.

现在,返回并运行sp_help您的表,并检查结果以查看您的表和索引数据现在位于何处.

如果您的表具有多个索引,则在运行上述语句以移动聚簇索引之后,sp_helpindex将显示您的聚簇索引位于新文件组上,但任何剩余索引仍将位于原始文件组上.该表将继续正常运行,但您应该有充分的理由希望索引位于不同的文件组中.如果希望表及其所有索引位于同一文件组中,请对每个索引重复上述说明CREATE [NONCLUSTERED, or other] ... DROP EXISTING...,并根据您要移动的索引类型进行替换.

  • 这里有关于移动非集群数据的好信息。 (2认同)
  • 最新版本的语法是“WITH (DROP_EXISTING = ON, ONLINE = ON)”,否则您会收到“无效使用选项 ONLINE” (2认同)

gbn*_*gbn 7

分区是一种解决方案,但您可以将聚集索引"移动"到新文件组而不会中断服务(受某些条件限制,请参阅下面的链接)

CREATE CLUSTERED /*oops*/ INDEX ... WITH (DROP_EXISTING = ON, ONLINE = ON, ...) ON newfilegroup
Run Code Online (Sandbox Code Playgroud)

聚集索引数据,这与移动文件组相同.

请参阅CREATE INDEX

这取决于您的主键是否已群集,这会改变我们的主要方式