Как переместить существующие индексы и первичные ключи во вторичную файловую группу в SQL SERVER

#sql #sql-server-2008 #indexing #primary-key #filegroup

#sql #sql-server-2008 #индексирование #первичный ключ #файловая группа

Вопрос:

Все индексы и первичные ключи были созданы в первичном файле (.mdf). Есть ли какой-либо способ переместить весь индекс и первичный ключ во вторичную файловую группу (.ndf)??

Ответ №1:

Используйте следующий запрос:

 DECLARE @SchemaName NVARCHAR(300),
        @ObjectName NVARCHAR(300),
        @IndexName NVARCHAR(300),
        @Columns NVARCHAR(MAX),
        @IncludeColumns NVARCHAR(MAX),
        @Command NVARCHAR(MAX)

DECLARE IndexCursor CURSOR FOR
    SELECT SCHEMA_NAME(o.schema_id),OBJECT_NAME(o.object_id), i.name, 
            STUFF((SELECT ',[' c.name ']'
            FROM sys.index_columns ic 
            INNER JOIN sys.columns c ON c.column_id = ic.column_id AND c.object_id = ic.object_id
            WHERE ic.object_id = i.object_id
                AND ic.index_id = i.index_id
                AND ic.is_included_column=0 
            ORDER BY ic.key_ordinal
            FOR XML PATH('')
            ),1,1,'') IndexColumn,
            STUFF((SELECT ',[' c.name ']'
            FROM sys.index_columns ic 
            INNER JOIN sys.columns c ON c.column_id = ic.column_id AND c.object_id = ic.object_id
            WHERE ic.object_id = i.object_id
                AND ic.index_id = i.index_id
                AND ic.is_included_column=1
            ORDER BY ic.key_ordinal
            FOR XML PATH('')
            ),1,1,'') IncludeColumn,
            i.filter_definition
    FROM sys.indexes i
    INNER JOIN sys.objects o ON o.object_id = i.object_id
    INNER JOIN sys.data_spaces ds ON ds.data_space_id = i.data_space_id
    WHERE ds.name = 'PRIMARY'
        AND OBJECTPROPERTY(i.object_id,'IsUserTable')=1

OPEN IndexCursor
FETCH NEXT FROM IndexCursor INTO @SchemaName, @ObjectName, @IndexName, @Columns, @IncludeColumns
WHILE @@FETCH_STATUS=0 BEGIN

    SET @Command = 'ALTER INDEX '   @IndexName   ' ON ['   @SchemaName   '].[' @ObjectName '](' @Columns ') '  ISNULL('Include (' @IncludeColumns ')','')   ' ON [YourFileGroupName]'
    EXEC(@Command)

    FETCH NEXT FROM IndexCursor INTO @SchemaName, @ObjectName, @IndexName, @Columns, @IncludeColumns
END
CLOSE IndexCursor
DEALLOCATE IndexCursor
  

Комментарии:

1. Как мне переместить все мои ограничения (PK amp; FK) вместе с индексами во вторичную файловую группу?

2. @Pradeep. Вы должны изменить запрос select и использовать sys.sysconstraints системную таблицу вместо sys.Indexes .

Ответ №2:

  1. Вы не можете перемещать индексы, созданные с использованием ограничения УНИКАЛЬНОГО или ПЕРВИЧНОГО КЛЮЧА, с помощью Management Studio. Для перемещения этих индексов используйте инструкцию CREATE INDEX с опцией (DROP_EXISTING=ON) в Transact-SQL.

  2. Если таблица имеет кластеризованный индекс, перемещение кластеризованного индекса в новую файловую группу перемещает таблицу в эту файловую группу.

Для пошаговых инструкций вы можете использовать документацию MS.