2013-01-20 1 views

답변

2

이렇게하면 클러스터 된 인덱스와 클러스터되지 않은 인덱스를 모두 포함하여 원하는대로 스크립트를 생성해야합니다. 기존 워크로드에 미치는 영향을 최소화하기 위해 ONLINE = ON 옵션을 추가했으나 어쨌든 이론적으로 인덱스 된 뷰는 거대하지 않아야하므로 과감한 영향을 주어서는 안됩니다. 물론이 옵션은 Enterprise Edition에서만 사용할 수 있으며 스크립트에서 처리합니다. 온라인으로 할 수 없다면 시뮬레이션 된 워크로드로 영향을 테스트하고 싶을 것입니다. (그리고 어떤 경우이든 먼저 테스트 환경에서이 작업을 테스트하고 싶을 것입니다.) 또한 상대 작업 시간 또는 이상적으로는 유지 관리 기간 동안이 작업을 예약하는 것이 가장 좋습니다. (results to text 모드에서 가장 잘 작동 당신이 SELECT 출력에 만족

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

... 

,하지만 여전히 당신을 변경 한 경우에만이 8K로 제한됩니다 : 같은

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; 

이 스크립트를 산출한다 tools/options으로 설정) EXEC의 주석을 제거하십시오. 하지만 다시 테스트 환경에서!

+0

Betrand : +1 고맙습니다. –