This can be a costly operation in terms of time and I/O
1) Create the filegroup
ALTER DATABASE myDatabase ADD FILEGROUP NewFileGroup GO ALTER DATABASE myDatabase ADD FILE ( NAME = N'NewFileGroupData' , FILENAME = 'D:\Data\NewFileGroupData.mdf' , SIZE = 5000MB , FILEGROWTH = 10%) TO FILEGROUP NewFileGroup GO
2A) If the table has a primary key or unique constraint, drop and recreate the constraint ...
USE myDatabase GO ALTER TABLE my.table DROP CONSTRAINT PK_Move WITH (MAXDOP =1,MOVE TO NewFileGroup) GO ALTER TABLE my.table ADD CONSTRAINT PK_Move PRIMARY KEY(id) WITH(MAXDOP =1) GO
2B) For a clustered / non-clustered index (outside of a constraint), recreate the index
using the CREATE INDEX statement, with DROP_EXISTING = ON
USE myDatabase GO CREATE NONCLUSTERED INDEX [ix_movethisindex] ON [my].[table] ( [column1] ASC, [column2] ASC, [column3] ASC )WITH (DROP_EXISTING = ON, ONLINE = ON, DATA_COMPRESSION = PAGE) ON [NewFileGroup] GO
Note : I use;
- ONLINE = ON for an ONLINE index build (Enterprise, Developer, and Evaluation editions only)
- DATA_COMPRESSION = PAGE (Am on SQL 2008 Enterprise and am utilising compression functionality)
2C) To move heaps (tables with no clustered indexes) across filegroups, create a clustered index on the new filegroup, and then remove it again. This has the downside of temporarily ordering the table.
USE myDatabase GO CREATE CLUSTERED INDEX [ix_temp] ON [my].[table] ( ID ASC )WITH ( ONLINE = OFF, DATA_COMPRESSION = PAGE) ON [NewFileGroup] GO DROP INDEX [ix_temp] ON [my].[table]
No comments:
Post a Comment