微软BI开拓者

首页 » 数据库专区 » SQL Server管理 » 将一个表从一个文件组移到另一个文件组
拓狼 - 5/23/2007 5:00:00 PM
将一个表从一个文件组移到另一个文件组

--王成辉原创,转贴请注明出自微软BI开拓者www.windbi.com

  很通常的一种方法是:在新文件组中创建一个表结构相同的新表,将原表的数据导入新表,删除原表,重命名新表。这样做很麻烦,而且还要重新设置权限等。其实如果了解了聚集索引的结构,就很简单了。

  聚集索引里存放的数据和表的数据必须在同一个文件组中,而且它们的顺序也是一致的,因为聚集索引的叶子节点实际上就是存放的表的数据,不象非聚集索引,叶子节点只是存放了一个指向表数据或者聚集索引的指针而已,真正的数据还是存放在表或聚集索引中。这样我们只要把聚集索引创建在新的文件组上,那么表的数据也就跟着转移到这个新的文件组上了。这里要注意的一点就是聚集索引和主键是不是建在相同的字段上的,如果相同,处理主键就行了,如果不同,则需处理聚集索引。具体如下:

首先,假设有一个表T,创建在文件组OldFilegroup上,现在要将表T移到新的文件组NewfileGroup上。

1、处理主键的情形,即聚集索引和主键建在相同的字段上

假设有一个主键名称为PK_T,首先删除主键:alter table T drop constraint PK_T
然后重新在新文件组上创建主键:
ALTER TABLE [dbo].[T] WITH NOCHECK ADD
CONSTRAINT [PK_T] PRIMARY KEY  CLUSTERED
(
  [id]--注意ID这里是你原来的那些主键组成的列

)  ON [NewFileGroup]

2、处理聚集索引的情形,即聚集索引和主键建不在相同的字段上

假设有一个聚集索引名称为IX_ID,首先删除聚集索引: drop index T.IX_ID
然后重新在新文件组上创建聚集索引:
create clustered index IX_ID on T(ID) on [NewfileGroup]--注意ID那里是你原来的那些聚集索引组成的列

这样,用下面的查询看看你的表是不是在新的文件组上了?
select groupname from sysindexes a inner join sysfilegroups b
on a.groupid=b.groupid
where id=object_id('T') and indid<2


注意:这时的权限都没有丢哦!还有就是非聚集索引目前还是存在旧文件组上的,要想让它也移到新文件组上,跟聚集索引的做法相同哟!
stswordman - 3/13/2009 10:59:00 AM
好!
taohl9177 - 3/23/2009 11:55:00 AM
不错,非常实用
fuxiaoyang13 - 3/23/2009 2:54:00 PM
好·!顶
Gorster - 12/25/2009 5:56:00 PM
非常有用,已经成功了,但还剩下Text/Image Filegroup没改过来,请问这个能改吗?怎么改,谢谢
vftop - 1/27/2010 5:39:00 AM
也可以通过删除聚集索引将一个表移动到另一个文件组
例如:t_test 有聚集索引,
DROP INDEX clusteredname ON dbo.t_test  WITH(MOVE TO filegroup1)

alter table dbo.t_test drop constraint pk_t_test_aa with(move to filegroup1)
vftop - 1/27/2010 5:40:00 AM
也可以通过删除聚集索引将一个表移动到另一个文件组
例如:t_test 有聚集索引,
DROP INDEX clusteredname ON dbo.t_test  WITH(MOVE TO filegroup1)

alter table dbo.t_test drop constraint pk_t_test_aa with(move to filegroup1)
拓狼 - 1/18/2012 3:23:00 AM


对于第一种情形,其实可以不用删除主键约束的,直接创建一个唯一的聚集索引就行了,代码如下:

create unique clustered index PK_T on  [dbo].[T]
(
  [id]--注意ID这里是你原来的那些主键组成的列

)  ON [NewFileGroup]
with(drop_existing=on)

至于Text/Image字段,只能通过重建表的方式来将它的数据移动到其他文件组上。


第二种情形也可以使用with(drop_existing=on)的方法来避免先做删除的操作。


其他信息可参考:
http://www.windbi.com/showtopic-68276.aspx
1
查看完整版本: 将一个表从一个文件组移到另一个文件组