2013-01-20 29 views

回答

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。但是,再次,在一个测试环境中!

+0

Betrand:+1非常感谢。 –

相关问题