パフォーマンスへの影響を最小限に抑えながら、複数のインデックス付きビューをプライマリ ファイル グループから別のファイル グループに移動したいと考えています。どうすればこれを達成できますか?
1 に答える
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(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
(モードで最適に動作しますが、それでも 8K に制限され、 で設定を変更したresults to text
場合のみtools / options
)、. EXEC
ただし、最初はテスト環境で行います。
于 2013-01-20T06:50:52.967 に答える