将所有非聚集索引移动到SQL Server中的另一个文件组

Iam*_*mIC 17 sql-server indexing database-design filegroup

在SQL Server 2008中,我想将数据库中的所有非聚集索引移动到辅助文件组.最简单的方法是什么?

dal*_*man 24

运行此更新的脚本以创建一个名为的存储过程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>';
Run Code Online (Sandbox Code Playgroud)

要创建将为数据库中的每个表运行此脚本的脚本,请将查询输出切换为文本,然后运行以下命令:

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;
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅原始博客.我没有写这个程序,但根据博客的回复更新了它,并确认它适用于SQL Server 2005和2008.

更新

  1. @psteffek 修改了脚本以在SQL Server 2012上工作.我合并了他的更改.
  2. 当您的表具有IGNORE_DUP_KEY选项时,该过程将失败.还没有解决这个问题.
  3. @srutzky指出,该程序并不保证保留索引的顺序,并就如何修复它提出了建议.我相应地更新了程序.
  4. ojiNY注意到该过程遗漏了索引过滤器(为了与SQL 2005兼容).根据他的建议,我把它们重新加入.


gbn*_*gbn 6

编写脚本,更改ON子句,删除它们,重新运行新脚本.真的没有其他选择.

幸运的是,有上Interwebs脚本,如这一个,将处理脚本为您服务.

  • 您还可以在新的`CREATE INDEX`语句中使用`WITH DROP_EXISTING`子句 - 保存一步(显式DROP INDEX) (5认同)