在 SQL Server 2008 中,我想将数据库中的所有非聚集索引移动到辅助文件组。最简单的方法是什么?
3 回答
运行这个更新的脚本来创建一个名为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 子句,删除它们,重新运行新脚本。真的别无选择。
幸运的是,Interwebs 上有一些脚本,比如这个可以为您处理脚本。
更新:如果您使用的是 MS SQL Server 管理器 2008R2 或更早版本,手动执行第 2 步需要很长时间。我使用了 sql server manager 2014,所以效果很好(因为它导出 drop 和 create index 的方式很容易修改)
我尝试在 SQL server 2014 中运行脚本并遇到了一些问题,我懒得检测问题, 所以我想出了另一个不依赖于您正在运行的 SQL 服务器版本的解决方案。
2.更新你的脚本,删除所有与drop create tables相关的东西,保持东西属于索引。并将您的原始索引替换为新索引(在我的情况下,我将 ON [PRIMARY] 替换为 ON [SECONDARY] [ ] 5
- 运行脚本!并等到它完成。
(您可能希望保存脚本以在其他环境中运行)。