Переместить индексированные представления в отдельную файловую группу
У меня есть несколько индексированных представлений, которые я хочу переместить из основной файловой группы в другую файловую группу, с минимальным влиянием на производительность. Как я могу сделать это?
1 ответ
Это должно сгенерировать скрипт, который будет делать то, что вы хотите, включая кластеризованные и любые некластеризованные индексы. Я добавил 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
, Но опять же, сначала в тестовой среде!