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

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

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

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

7 ответов


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

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

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]

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

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

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


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

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

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

sp_help N'<<your table name>>'

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

чтобы переместить индекс, запишите 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>>

на 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

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

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

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


этот отрывок из SQL Server Books Online говорит Все: "поскольку уровень листа кластеризованного индекса и страницы данных одинаковы по определению, создание кластеризованного индекса и использование 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):

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

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

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

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

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

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

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

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

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


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