Как я могу перемещать таблицу в другую файловую группу?
У меня есть база данных SQL Server 2008 Ent и OLTP с двумя большими таблицами. Как я могу переместить эти таблицы в другую файловую группу без прерывания обслуживания? Теперь добавлено около 100-130 записей и 30-50 записей, обновляемых каждую секунду в этих таблицах. Каждая таблица имеет около 100 М записей и шесть полей (включая одну географию поля).
Я ищу решение через google, но все решения содержат "создать вторую таблицу, вставить строки из первой таблицы, отбросить первую таблицу, bla bla bla".
Могу ли я использовать функции секционирования для решения этой проблемы? Спасибо.
Ответы
Ответ 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