将一个表从一个文件组移到另一个文件组

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

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

首先,假设有一个表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


注意:这时的权限都没有丢哦!还有就是非聚集索引目前还是存在旧文件组上的,要想让它也移到新文件组上,跟聚集索引的做法相同哟!

--王成辉原创

posted on 2011-12-28 11:12  xiaohuime  阅读(443)  评论(0编辑  收藏  举报