运行这个更新的脚本 https://gist.github.com/dalenewman/6377911创建一个名为的存储过程MoveIndexToFileGroup
。此过程将表上的所有非聚集索引移动到指定的文件组。它甚至支持INCLUDE
其他一些脚本没有的列。此外,它不会重建或移动所需文件组上已有的索引。创建过程后,按如下方式调用它:
EXEC MoveIndexToFileGroup @DBName = '<your database name>',
@SchemaName = '<schema name that defaults to dbo>',
@ObjectNameList = '<a table or list of tables>',
@IndexName = '<an index or NULL for all of them>',
@FileGroupName = '<the target file group>';
要创建一个将为数据库中的每个表运行此脚本的脚本,请将查询输出切换为文本,然后运行以下命令:
SELECT 'EXEC MoveIndexToFileGroup '''
+TABLE_CATALOG+''','''
+TABLE_SCHEMA+''','''
+TABLE_NAME+''',NULL,''the target file group'';'
+char(13)+char(10)
+'GO'+char(13)+char(10)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, TABLE_NAME;
请参考原文blog http://blogs.msdn.com/b/ramoji/archive/2008/09/26/how-to-move-existing-indexes-from-one-filegroup-to-another.aspx更多细节。我没有编写此过程,但根据博客的响应对其进行了更新,并确认它适用于 SQL Server 2005 和 2008。
Updates
- @psteffek修改了脚本 https://gist.github.com/psteffek/6877012在 SQL Server 2012 上工作。我合并了他的更改。
- 当您的表具有以下内容时,该过程将失败
IGNORE_DUP_KEY
选项打开。目前还没有解决这个问题。
- @srutzky 指出该过程不能保证保留索引的顺序,并就如何修复它提出了建议。我相应地更新了程序。
-
ojiNY https://github.com/ojiNY注意到该过程省略了索引过滤器(为了与 SQL 2005 兼容)。根据他的建议,我将它们添加回来。