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

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

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

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

Ответы [ 8 ]

73 голосов
/ 13 марта 2010

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

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

.
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 по CREATE INDEX для получения подробной информации обо всех доступных параметрах, которые вы можете указать.

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

24 голосов
/ 11 июля 2015

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

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

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

sp_help N'<<your table name>>'

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

7 голосов
/ 13 марта 2010

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

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

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

Пожалуйста, смотрите CREATE INDEX

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

2 голосов
/ 14 октября 2018

Обратите внимание, что при воссоздании кластеризованного индекса перемещаются только «примитивные» столбцы, например int, bit, datetime и т. Д.

Чтобы переместить varchar(max), varbinary и другие столбцы «BLOB-объектов», вам необходимо воссоздать таблицу. К счастью, есть способ сделать это полуавтоматически в SSMS - изменив «текстовую файловую группу» в окне «дизайн» таблицы, а затем сохранив изменения.

Я писал об этом здесь: https://www.jitbit.com/alexblog/153-moving-sql-table-textimage-to-a-new-filegroup/, если вам нужно больше деталей.

2 голосов
/ 06 июля 2014

В этом отрывке из электронной документации по 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

1 голос
/ 23 марта 2017

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

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

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

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

0 голосов
/ 26 декабря 2016
CREATE CLUSTERED INDEX IXC_Products_Product_id
ON dbo.Products(Product_id)
WITH (DROP_EXISTING = ON) ON MyNewFileGroup
0 голосов
/ 21 августа 2013

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

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

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

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

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

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

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

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

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

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

...