Безболезненный способ создания кластерного индекса на огромной таблице?

22

Таким образом, у нас есть сайт для клиентов, который жалуется на серьезную медленную работу. Я взглянул один раз, и стало очевидно, что проблема в том, что Somebody Else (grrrr) разработал таблицу, содержащую более 20 миллионов записей без кластерного индекса.

Теперь я хочу создать кластеризованный индекс для этой таблицы - но в моей тестовой среде моя create indexкоманда выполнялась в течение часа, а она все еще не выполнена. Сайт клиента - это цех, который работает круглосуточно и без выходных, пока я создаю индекс.

Существует ли какой-либо менее грубый метод создания индекса, который либо быстро завершит работу, либо сделает это каким-то разумным способом, который не будет полностью убивать производительность сервера, пока он занят?

Мы используем SQL Server Enterprise Edition.

Шауль говорит, что я поддерживаю Монику
источник

Ответы:

26
  • Если ваш sql-сервер Enterprise + edition и в таблице нет полей BLOB - CREATE CLUSTERED INDEX ... WITH(ONLINE=ON)

  • Если нет - нет никакого другого способа, кроме как создать таблицу с одной и той же схемой сбоку и грамотно передать в нее данные, включая все операции INSERT / UPDATE / DELETE (например, с помощью триггера), а затем точно удалить старую таблицу и переименовать новое с тем же именем, что и старое - минусы: медленный, добавляет дополнительную нагрузку на сервер и хранилище

Олег Док
источник
12

Не уверен, какую версию SQL-сервера использует ваш клиент. На предприятии вы можете построить индекс с помощью (ONLINE = ON), чтобы таблица была доступна до создания индекса.


источник
8
  • Создать новую таблицу, идентичную оригинальной (очевидно, потребуется другое имя)
  • Создать кластерный индекс на новой таблице
  • Загрузить данные в новую таблицу
  • Оставить оригинальный стол
  • Переименовать новую таблицу, используя оригинальное имя

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

Bryan
источник