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

时间:2010-11-21 09:43:59

标签: sql-server database-design indexing filegroup

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

2 个答案:

答案 0 :(得分:23)

运行此updated script以创建名为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。我没有写这个程序,但根据博客的回复更新了它,并确认它适用于SQL Server 2005和2008.

更新

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

答案 1 :(得分:5)

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

幸运的是,Interwebs上有一些脚本,例如one,它将为您处理脚本。