Как я могу переместить таблицу в другую файловую группу?


У меня есть SQL Server 2008 Ent и база данных OLTP с двумя большими таблицами. Как я могу переместить эти таблицы в другую файловую группу без прерывания обслуживания? Теперь, около 100-130 записей вставлены и 30-50 записей обновляются каждую секунду в этой таблице. Каждая таблица имеет около 100 м записей и шесть полей (в том числе одно поле географии).

Я ищу решение через google, но все решения содержат " создать вторую таблицу, вставить строки из первой таблицы, отбросить первую таблицу, бла-бла бла".

могу ли я использовать функции секционирования для решения этой проблемы? Спасибо.

7 52

7 ответов:

Если вы хотите просто переместить таблицу в новую файловую группу, вам нужно воссоздать кластеризованный индекс в таблице (в конце концов: кластеризованный индекс - это данные таблицы) в новой файловой группе, которую вы хотите.

Вы можете сделать это с например:

CREATE CLUSTERED INDEX CIX_YourTable
   ON dbo.YourTable(YourClusteringKeyFields)
   WITH DROP_EXISTING
   ON [filegroup_name]

или если ваш кластеризованный индекс уникальный:

CREATE UNIQUE CLUSTERED INDEX CIX_YourTable
   ON dbo.YourTable(YourClusteringKeyFields)
   WITH DROP_EXISTING
   ON [filegroup_name]

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

посмотреть MSDN docs on CREATE INDEX для получения подробной информации о всех доступных параметрах, которые вы можете указать.

Это, конечно, еще не связано с разделением, но это совсем другая история...

чтобы ответить на этот вопрос, сначала мы должны понять

  • если таблица не имеет индекса, ее данные называются кучу
  • если таблица имеет кластеризованный индекс, этот индекс фактически табличных данных. Поэтому при перемещении кластеризованного индекса также будут перемещены и данные.

первым шагом является получение дополнительной информации о таблице, которую мы хотим переместить. Мы делаем это, выполняя это T-SQL:

sp_help N'<<your table name>>'

вывод покажет вам столбец под названием ' Data_located_on_filegroup."Это удобный способ узнать, в какой файловой группе находятся данные вашей таблицы. Но более важным является вывод, который показывает вам информацию об индексах таблицы. (Если вы хотите видеть только информацию об индексах таблицы, просто запустите sp_helpindex N'<<your table name>>') ваша таблица может иметь 1) нет индексов (так что это куча), 2) один индекс, или 3) несколько индексов. Если index_description начинается с ' clustered, unique, ...- это индекс, который вы хотите переместить. Если индекс также является первичным ключом, это нормально, вы все равно можете его переместить.

чтобы переместить индекс, запишите index_name и index_keys, показанные в результатах приведенного выше запроса справки, а затем используйте их для заполнения <<blanks>> в следующем запросе:

CREATE UNIQUE CLUSTERED INDEX [<<name of clustered index>>]
ON [<<table name>>]([<<column name the index is on - from index_keys above>>])
WITH DROP_EXISTING, ONLINE
ON <<name of file group you want to move the index to>>

The DROP EXISTING, ONLINE параметры выше важны. DROP EXISTING убедитесь, что индекс не дублируется, и ONLINE держит таблицу он-лайн пока вы двигаете оно.

если индекс, который вы перемещаете,не кластеризованный индекс, а затем заменить UNIQUE CLUSTERED выше NONCLUSTERED

чтобы переместить таблицу кучи, добавьте к ней кластеризованный индекс, затем выполните приведенную выше инструкцию, чтобы переместить ее в другую файловую группу, а затем удалите индекс.

теперь возвращайся и беги sp_help на вашей таблице и проверьте результаты, чтобы увидеть, где теперь находятся ваши данные таблицы и индекса.

если ваша таблица имеет больше чем одно индекс, затем после выполнения приведенной выше инструкции для перемещения кластеризованного индекса,sp_helpindex покажет, что ваш кластеризованный индекс находится в новой файловой группе, но все остальные индексы будут по-прежнему находиться в исходной файловой группе. Таблица будет продолжать нормально функционировать, но у вас должна быть веская причина, почему вы хотите, чтобы индексы находились в разных файловых группах. Если вы хотите, чтобы таблица и все ее индексы находились в одной файловой группе, повторите приведенные выше инструкции для каждого индекса, подставляя CREATE [NONCLUSTERED, or other] ... DROP EXISTING... при необходимости, в зависимости от типа индекса, который вы перемещаете.

секционирование-это одно из решений, но вы можете "переместить" кластеризованный индекс в новую файловую группу без прерывания службы (при соблюдении некоторых условий, см. ссылку ниже) с помощью

CREATE CLUSTERED /*oops*/ INDEX ... WITH (DROP_EXISTING = ON, ONLINE = ON, ...) ON newfilegroup

кластерный индекс и данные и это то же самое, что перемещение файловой группы.

см. СОЗДАТЬ ИНДЕКС

Это зависит от того, является ли ваш первичный ключ кластеризованным или нет, что меняет то, как мы это сделаем

в этом отрывке из электронной документации по SQL Server все сказано: "поскольку конечный уровень кластеризованного индекса и страницы данных по определению одинаковы, создайте кластеризованный индекс и используйте on partition_scheme_name или on filegroup_name эффективно перемещает таблицу из файловой группы, в которой она была создана, в новую схему секционирования или файловую группу."(Источник - http://msdn.microsoft.com/en-us/library/ms188783.aspx) от (http://www.mssqltips.com/sqlservertip/2442/move-data-between-sql-server-database-filegroups/)

Как уже говорили другие друзья, как принятый ответ от marc_s ниже скриншот дает вам другой способ сделать это с помощью SSMS GUI.

обратите внимание, что вы можете легко перейти в другую файловую группу свойства index на вкладке storage enter image description here

как я могу перенести таблицу в другую файловую группу?

Примечание: перемещение таблицы в другую файловую группу работает только с Enterprise Edition.

Шаг 1 :

проверьте, в какой таблице файловой группы находится:

-- Query to check the tables and their current filegroup:

SELECT    tbl.name AS [Table Name], 
          CASE WHEN dsidx.type='FG' THEN dsidx.name ELSE '(Partitioned)' END AS [File Group] 
FROM      sys.tables AS tbl 
JOIN      sys.indexes AS idx 
ON        idx.object_id = tbl.object_id 
AND       idx.index_id <= 1 
LEFT JOIN sys.data_spaces AS dsidx 
ON        dsidx.data_space_id = idx.data_space_id 
ORDER BY  [File Group], [Table Name] 

Шаг 2 :

переместить существующую таблицу / таблицы в новую файловую группу

если файловая группа, в которую вы хотите переместить таблица to еще не существует тогда, пожалуйста, создайте вторичную файловую группу и затем переместите таблицу.

для перемещения таблицы в другую файловую группу необходимо переместить кластеризованный индекс таблицы в новую файловую группу. Конечный уровень некластеризованного индекса содержит табличные данные. Таким образом, перемещение кластеризованного индекса можно выполнить в одном операторе, используя предложение DROP_EXISTING следующим образом:

CREATE UNIQUE CLUSTERED INDEX [Index_Name] ON [SchemaName].[TableName]
(
    [ClusteredIndexKeyFields]
)WITH (DROP_EXISTING = ON, ONLINE = ON) ON [FilegroupName]
GO

Шаг 3:

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

вы должны переместить некластеризованные индексы вручную, используя следующий синтаксис:

--1st check the index information using the following sp
sp_helpindex [YourTableName]


--Now by using the following query you can move the remaining indexes to secondary filegroup
CREATE NONCLUSTERED INDEX [Index_Name] ON [SchemaName].[TableName]
(
    [IndexKeyFields]
)WITH (DROP_EXISTING = ON, ONLINE = ON) ON [FilegroupName]
GO

перемещение кучи в другую файловую группу:

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

Я думаю, что эти шаги очень просты и прямо вперед, чтобы переместить любую таблицу в другую группу файлов (через Management Studio):

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

  • измените индекс кластера на некластерный и просто измените его файловую группу (как и на предыдущем шаге)

  • Добавить новый временный индекс кластера с "новый файл группа " через эту команду (или через IDE) :

       CREATE CLUSTERED INDEX [PK_temp]
    ON YOURTABLE([Id])
      ON NEWFILEGROUP
    

    (приведенная выше команда приводит к перемещению всех данных в новую файловую группу)

  • удалить вышеуказанный временный ПК (когда он делает свою работу превосходно!)

  • измените свой основной индекс кластера, чтобы снова стать индексом кластера (через IDE снова)

преимущество вышеуказанных шагов не нужно отбрасывать существующие отношения FK. Также использование IDE предотвращает потерю данных по ошибке условия.

Примечание: убедитесь, что дисковая квота не включена для вашей файловой группы или установите ее правильно. В противном случае вы получите исключение "файловая группа заполнена"!

CREATE CLUSTERED INDEX IXC_Products_Product_id
ON dbo.Products(Product_id)
WITH (DROP_EXISTING = ON) ON MyNewFileGroup