Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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 voila, ваши данные таблицы были перемещены в новую файловую группу.

Подробнее о всех доступных параметрах, которые вы можете указать, см. в в документах MSDN в CREATE INDEX.

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

Ответ 2

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

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

Первый шаг - узнать больше информации о таблице, которую мы хотим переместить. Мы делаем это, выполняя этот 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>>

Значения DROP EXISTING, ONLINE выше. DROP EXISTING гарантирует, что индекс не дублируется, а ONLINE сохраняет таблицу в сети, пока вы ее перемещаете.

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

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

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

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

Ответ 3

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

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

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

См. CREATE INDEX

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

Ответ 4

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

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

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

Ответ 5

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

ПРИМЕЧАНИЕ. Перемещение таблицы в другую файловую группу работает только с 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:

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

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

Чтобы переместить таблицу в другую файловую группу, нужно переместить кластерный индекс таблиц в новую файловую группу. Уровень листа кластерного индекса фактически содержит данные таблицы. Поэтому перемещение кластерного индекса может выполняться в одном выражении с использованием предложения 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

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

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

Ответ 6

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

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

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

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

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

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

  • Удалите предыдущую временную PK (когда она выполняет свою работу в префектуре!)

  • Снова измените индекс основного кластера на индекс кластера (снова через IDE)

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

ПРИМЕЧАНИЕ. Убедитесь, что квота диска не включена для вашей файловой группы или не задана ее корректно. В противном случае вы получите исключение "filegroup is full"!

Ответ 7

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