17

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

4

3 回答 3

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>';

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

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。

更新

  1. @psteffek修改了脚本以在 SQL Server 2012 上运行。我合并了他的更改。
  2. 当您的表具有该IGNORE_DUP_KEY选项时,该过程将失败。还没有解决这个问题。
  3. @srutzky 指出该过程不能保证保留索引的顺序,并就如何修复它提出了建议。我相应地更新了程序。
  4. ojiNY注意到该过程省略了索引过滤器(为了与 SQL 2005 兼容)。根据他的建议,我重新添加了它们。
于 2011-05-03T21:34:04.007 回答
6

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

幸运的是,Interwebs 上有一些脚本,比如这个可以为您处理脚本。

于 2010-11-21T10:33:06.083 回答
1

更新:如果您使用的是 MS SQL Server 管理器 2008R2 或更早版本,手动执行第 2 步需要很长时间。我使用了 sql server manager 2014,所以效果很好(因为它导出 drop 和 create index 的方式很容易修改) 我尝试在 SQL server 2014 中运行脚本并遇到了一些问题,我懒得检测问题, 所以我想出了另一个不依赖于您正在运行的 SQL 服务器版本的解决方案。

  1. 导出索引(使用 drop 和 create) 右键单击您的数据库选择生成脚本

选择要移动索引的表 在此处输入图像描述

2.更新你的脚本,删除所有与drop create tables相关的东西,保持东西属于索引。并将您的原始索引替换为新索引(在我的情况下,我将 ON [PRIMARY] 替换为 ON [SECONDARY] [ 在此处输入图像描述] 5

  1. 运行脚本!并等到它完成。

(您可能希望保存脚本以在其他环境中运行)

于 2015-08-25T08:26:18.953 回答