在 SQL Server 2008 中,我想将一个数据库中的 所有 非聚集索引移动到一个次要的文件组中。最简单的方法是什么?
运行这个更新的脚本,以创建名为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;
请参考原始的博客获取更多细节。虽然我并没有编写这个程序,但我已根据博客的回复进行了更新,并确认它在SQL Server 2005和2008上都可以正常工作。
脚本它们,更改ON从句,删除它们,重新运行新脚本。实际上没有其他选择。
幸运的是,互联网上有这样的脚本,例如这个,可以为您处理脚本。
CREATE INDEX
语句中使用WITH DROP_EXISTING
子句 - 这样可以省去显式的DROP INDEX步骤。 - marc_s