如何将表移动到另一个文件组?
我有两个大的表SQL Server 2008 Ent和OLTP数据库。 如何将这些表移动到另一个文件组而不中断服务? 现在,在这个表格中,每秒插入约100-130条logging和30-50条logging。 每个表格有大约1亿条logging和6个领域(包括1个领域地理)。
我通过谷歌寻找解决scheme,但所有的解决scheme都包含“创build第二个表,从第一个表插入行,放下第一个表,bla bla bla”。
我可以使用分区function来解决这个问题吗? 谢谢。
如果只想将表移动到新的文件组,则需要在所需的新文件组上重新创build表上的聚簇索引(毕竟:聚簇索引是表数据)。
你可以用例如:
CREATE CLUSTERED INDEX CIX_YourTable ON dbo.YourTable(YourClusteringKeyFields) WITH DROP_EXISTING ON [filegroup_name]
或者你的聚集索引是唯一的 :
CREATE UNIQUE CLUSTERED INDEX CIX_YourTable ON dbo.YourTable(YourClusteringKeyFields) WITH DROP_EXISTING ON [filegroup_name]
这将创build一个新的聚集索引并删除现有的索引,并在您指定的文件组中创build新的聚簇索引,等等,您的表数据已移至新文件组。
有关可能要指定的所有可用选项的详细信息,请参阅CREATE INDEX上的MSDN文档 。
这当然还没有涉及分配,但这是一个完整的自己的故事…
要回答这个问题,首先我们必须明白
- 如果一个表没有索引,它的数据被称为堆
- 如果一个表有一个聚集索引,那么这个索引就是你的表数据。 因此,如果您移动聚集索引,您也将移动您的数据。
第一步是找出更多关于我们想要移动的表的信息。 我们通过执行这个T-SQL来做到这一点:
sp_help N'<<your table name>>'
输出将显示一个标题为“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>>
以上的DROP EXISTING, ONLINE
选项非常重要。 DROP EXISTING
确保索引不重复, ONLINE
在移动时保持联机状态。
如果您要移动的索引不是聚簇索引,请用NONCLUSTERED
replace上面的UNIQUE CLUSTERED
要移动一个堆表,向它添加一个聚簇索引,然后运行上述语句将其移动到不同的文件组,然后删除该索引。
现在,返回并在您的表上运行sp_help
,并检查结果以查看您的表和索引数据现在的位置。
如果您的表有多个索引 ,则在运行上述语句以移动聚簇索引后, sp_helpindex
将显示您的聚簇索引位于新文件组上,但其余任何索引仍将位于原始文件组上。 该表将继续正常工作,但您应该有一个很好的理由,为什么你想索引位于不同的文件组。 如果您希望表及其所有索引位于同一个文件组中,请针对每个索引重复上述说明,并根据需要replaceCREATE [NONCLUSTERED, or other] ... DROP EXISTING...
正在移动。
分区是一个解决scheme,但是您可以将聚簇索引“移动”到新文件组中,而不会中断服务(受某些条件限制,请参阅下面的链接)
CREATE CLUSTERED /*oops*/ INDEX ... WITH (DROP_EXISTING = ON, ONLINE = ON, ...) ON newfilegroup
聚簇索引是数据,这与移动文件组相同。
请参阅CREATE INDEX
这取决于你的主键是否被聚集,这改变了我们如何做
SQL Server联机丛书摘录如下:“因为根据定义聚簇索引和数据页的叶级别相同,所以创build聚簇索引并使用ON partition_scheme_name或ON filegroup_name 子句可以有效地从文件组中移动一个表在哪个表上创build新分区scheme或文件组“ 。 (源 – http://msdn.microsoft.com/en-us/library/ms188783.aspx )从( http://www.mssqltips.com/sqlservertip/2442/move-data-between-sql-server-database -filegroups / )
正如其他朋友已经说过的那样,marc_s接受的答案如下是截图为您提供了另一种使用SSMS GUI的方法。
请注意,您可以轻松移动到存储选项卡中的索引属性的另一个文件组
如何将表移动到另一个文件组?
注意:将表移动到另一个文件组只适用于企业版。
步骤1 :
检查哪个文件组表正在:
-- Query to check the tables and their current filegroup: SELECT tbl.name AS [Table Name], CASE WHEN dsidx.type='FG' THEN dsidx.name ELSE '(Partitioned)' END AS [File Group] FROM sys.tables AS tbl JOIN sys.indexes AS idx ON idx.object_id = tbl.object_id AND idx.index_id <= 1 LEFT JOIN sys.data_spaces AS dsidx ON dsidx.data_space_id = idx.data_space_id ORDER BY [File Group], [Table Name]
第2步 :
将现有的表/表移动到新的文件组
如果您要移动表的文件组不存在,请创build辅助文件组,然后移动表。
将表移动到不同的文件组需要将表的聚簇索引移动到新的文件组。 聚簇索引的叶级实际上包含表数据。 因此,移动聚集索引可以使用DROP_EXISTING子句在单个语句中完成,如下所示:
CREATE UNIQUE CLUSTERED INDEX [Index_Name] ON [SchemaName].[TableName] ( [ClusteredIndexKeyFields] )WITH (DROP_EXISTING = ON, ONLINE = ON) ON [FilegroupName] GO
第3步:
将剩余的非聚集索引移动到辅助文件组
您必须通过使用下面的语法手动移动非聚集索引:
--1st check the index information using the following sp sp_helpindex [YourTableName] --Now by using the following query you can move the remaining indexes to secondary filegroup CREATE NONCLUSTERED INDEX [Index_Name] ON [SchemaName].[TableName] ( [IndexKeyFields] )WITH (DROP_EXISTING = ON, ONLINE = ON) ON [FilegroupName] GO
将堆移到另一个文件组:
正如我所知,将Heap移动到另一个文件组的唯一方法是在新文件组上临时添加聚簇索引,然后将其删除(如有必要)。
我认为这些步骤非常简单直接,可以将任何表移动到不同的文件组(通过Management Studio):
-
只需通过更改每个索引的FileGroup属性,将所有非聚簇索引移动到新的文件组
-
将群集索引更改为非群集,并简单地更改其文件组(如上一步)
-
通过此命令(或通过IDE)添加一个新的临时群集索引与“新文件组”:
CREATE CLUSTERED INDEX [PK_temp] ON YOURTABLE([Id]) ON NEWFILEGROUP
(上述命令导致将所有数据移动到新的文件组)
-
删除上面的临时PK(当它完成它的工作时!)
-
将主群集索引重新更改为群集索引(再次通过IDE)
上述步骤的好处是不需要放弃现有的FK关系。 另外使用IDE可以防止在错误情况下丢失数据。
注意:确保您的FileGroup未启用磁盘配额或将其设置为正确。 否则,你会得到“文件组已满”的例外!
CREATE CLUSTERED INDEX IXC_Products_Product_id ON dbo.Products(Product_id) WITH (DROP_EXISTING = ON) ON MyNewFileGroup