Переместить индексированные представления в отдельную файловую группу

У меня есть несколько индексированных представлений, которые я хочу переместить из основной файловой группы в другую файловую группу, с минимальным влиянием на производительность. Как я могу сделать это?

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, Но опять же, сначала в тестовой среде!

Другие вопросы по тегам