将索引视图移动到单独的文件组

时间:2013-01-20 06:04:50

标签: sql-server sql-server-2012 indexed-view

我有多个索引视图,我想从主文件组移动到另一个文件组,对性能的影响最小。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:2)

这应该生成脚本以执行您想要的操作,包括聚簇索引和任何非聚簇索引。我添加了ONLINE = ON选项以最大限度地减少对现有工作负载的影响,但理论上,无论如何,您的索引视图不应该很大,因此不应产生任何重大影响。当然,此选项仅在Enterprise Edition中可用,并且脚本会处理该选项。如果你不能在线完成,你当然希望用模拟工作负载测试影响(并且你将首先想要在测试环境中测试这个操作)。最好安排这项工作以确定相对停机时间,或者理想情况下是维护窗口。

DECLARE @opt NVARCHAR(13),  @sql NVARCHAR(MAX), @fg  NVARCHAR(128);

SELECT @fg  = N'OtherFileGroupName', -- please fix this
  @sql = N'', 
  @opt = CASE WHEN CONVERT(NVARCHAR(32), SERVERPROPERTY('Edition')) 
    LIKE N'Enterprise%' THEN N', ONLINE = ON' ELSE N'' END;

SELECT @sql = @sql + N'
  CREATE ' + CASE WHEN i.index_id = 1 
    THEN 'UNIQUE CLUSTERED' 
    ELSE '' END
  + ' INDEX ' + QUOTENAME(i.name) 
  + ' ON ' + QUOTENAME(SCHEMA_NAME(v.[schema_id]))
  + '.' + QUOTENAME(v.name) 
  + '(' + STUFF((SELECT ',' + QUOTENAME(c.name)
    FROM sys.columns AS c
    INNER JOIN sys.index_columns AS ic 
    ON c.[object_id] = ic.[object_id]
    AND c.column_id = ic.column_id
    WHERE c.[object_id] = v.[object_id]
    AND ic.index_id = i.index_id
    FOR XML PATH, TYPE).value('.[1]', 'nvarchar(max)'),1,1,'')
  + ') 
  WITH (DROP_EXISTING = ON' + @opt + ')
  ON ' + QUOTENAME(@fg) + ';'
FROM sys.views AS v
INNER JOIN sys.indexes AS i
ON v.[object_id] = i.[object_id]
ORDER BY i.index_id;

SELECT @sql;
-- EXEC sp_executesql @sql;

这应该产生如下脚本:

CREATE UNIQUE CLUSTERED INDEX [x] 
  ON [dbo].[splunge_view]([id])
  WITH (DROP_EXISTING = ON, ONLINE = ON)
  ON [OtherFileGroupName];

CREATE  INDEX [y] 
  ON [dbo].[splunge_view]([c],[id]) 
  WITH (DROP_EXISTING = ON, ONLINE = ON)
  ON [OtherFileGroupName];

...

如果您对SELECT输出感到满意(在results to text模式下效果最佳,但仍然限制在8K,并且仅当您更改tools / options中的设置时),请取消注释EXEC。但是,首先,在测试环境中!