Переместить таблицу из раздела - PullRequest
0 голосов
/ 23 августа 2011

У меня есть очень большая таблица (800 ГБ), которая имеет поле DATETIME, которое является частью схемы раздела. Это поле называется tran_date. У меня проблема в том, что индексы не выровнены должным образом с разделом, и я не могу включить поле tran_date в PRIMARY KEY, потому что оно установлено в nullable.

Я могу отбросить все связи внешнего ключа, статистику и индексы, но не могу изменить столбец, поскольку схема раздела по-прежнему зависит от столбца tran_date.

В своем исследовании я нашел один способ убрать таблицу из раздела, который состоит в том, чтобы удалить кластеризованный индекс, а затем переписать кластеризованный индекс в файловую группу PRIMARY, что затем позволит мне изменить столбец, но для удаления этой операции требуется несколько часов, 13 часов для записи временного КЛАСТЕРНОГО ИНДЕКСА на ПЕРВИЧНОМ, а затем я должен удалить его, изменить таблицу и правильно переписать КЛАСТЕРНЫЙ ИНДЕКС, что занимает еще 13 часов. Кроме того, у меня есть несколько таблиц.

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

Если я смогу переместить таблицу с раздела без необходимости писать КЛАСТЕРНЫЙ ИНДЕКС на ПЕРВИЧНОМ, это значительно сократит время, необходимое для изменения столбца.

1 Ответ

1 голос
/ 23 августа 2011

Независимо от того, что вы собираетесь в конечном итоге переместить данные из «точки A» (хранящиеся в разделах таблицы в базе данных) в «точку B» ( не , хранящиеся в разделах таблицы в базе данных.Цель состоит в том, чтобы свести к минимуму количество обработок всех этих данных. Простейший способ сделать это может быть:

  • Создать новую однораздельную таблицу
  • Скопироватьданные в эту таблицу
  • удалить исходную таблицу
  • переименовать новую таблицу в правильное имя

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

КонечноСуществует проблема «что, если пользователи изменят данные во время их копирования» ... но разбиение таблиц подразумевает складирование, поэтому я полагаю, вам не нужно об этом беспокоиться.

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

...