我有多个索引视图,我想将它们从主文件组移动到另一个文件组,对性能的影响最小。我怎样才能做到这一点?
问问题
197 次
1 回答
2
这应该生成脚本来执行您想要的操作,包括聚集索引和任何非聚集索引。我添加了ONLINE = ON
最小化对现有工作负载的影响的选项,但无论如何,理论上,您的索引视图不应该很大,因此不应该产生任何重大影响。当然,这个选项只在企业版中可用,脚本会处理它。如果您不能在线执行此操作,您肯定希望使用模拟工作负载测试影响(无论如何您都希望首先在测试环境中测试此操作)。而且您最好将这项工作安排在相对停机时间,或者理想情况下,是一个维护窗口。
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(N'./text()[1]', N'nvarchar(max)'),1,1,N'')
+ ')
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
. 但同样,首先在测试环境中!
于 2013-01-20T06:50:52.967 回答