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文档.
这当然还没有处理分配问题,但这完全是另一个故事......
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...
,并根据您要移动的索引类型进行替换.
分区是一种解决方案,但您可以将聚集索引"移动"到新文件组而不会中断服务(受某些条件限制,请参阅下面的链接)
CREATE CLUSTERED /*oops*/ INDEX ... WITH (DROP_EXISTING = ON, ONLINE = ON, ...) ON newfilegroup
Run Code Online (Sandbox Code Playgroud)
聚集索引是数据,这与移动文件组相同.
请参阅CREATE INDEX
这取决于您的主键是否已群集,这会改变我们的主要方式