Удаление / восстановление индексов во время массовой вставки - PullRequest
3 голосов
/ 05 августа 2011

У меня есть таблицы, в которых более 70 миллионов записей;Я обнаружил, что разработчики отбрасывали индексы перед массовой вставкой, а затем создавали ее снова после окончания массовой вставки.Время выполнения хранимой процедуры составляет около 30 минут (выполните удаление индекса, массовую вставку, а затем воссоздание индекса с нуля

Совет. Рекомендуется ли удалять индексы из таблицы, содержащей более 70 миллионов записей?и увеличивается на 3-4 миллиона каждый день.

Поможет ли улучшить производительность, не удаляя индекс перед массовой вставкой?

Какую рекомендацию следует придерживаться при выполнении BULK-вставки в BIGТАБЛИЦА.

Спасибо и С уважением

1 Ответ

7 голосов
/ 05 августа 2011

Как и все в SQL Server, «это зависит»

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

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

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


Если я правильно читаю ваш вопрос, эта таблица в значительной степени закрыта (заблокирована) на время загрузки, и это проблема.

Если ваша основная цель - увеличить доступность / уменьшить блокировку, попробуйте использовать подход A / B-таблицы.

Подход A / B разбивается следующим образом:

Учитывая таблицу с именем «MyTable», вы фактически имеете две физические таблицы (MyTable_A и MyTable_B) и одно представление (MyTable).

Если MyTable_A содержит текущий «активный» набор данных, ваш вид (MyTable) выбирает все столбцы из MyTable_A. В то же время вы можете использовать карт-бланш для MyTable_B (который содержит копию данных MyTable_A и новых данных, которые вы пишете.) Как только MyTable_B загружен, проиндексирован и готов к работе, обновите представление «MyTable», указав MyTable_B и обрезав MyTable_A. ,

Этот подход предполагает, что вы готовы увеличить затраты на ввод-вывод и хранение (в вашем случае значительно) для поддержания доступности. Это также предполагает, что ваш большой стол также относительно статичен. Если вы придерживаетесь этого подхода, я бы порекомендовал второе представление, что-то вроде MyTable_old, которое указывает на неживую таблицу (т. Е. Если MyTable_A является текущей таблицей представления и на нее ссылается представление MyTable, MyTable_old будет ссылаться на MyTable_B). Вы бы обновили представление MyTable_old одновременно с обновлением представления MyTable.


В зависимости от характера данных, которые вы вставляете (и вашей версии / издания SQL Server), вы также можете воспользоваться преимуществами разделения ( Блог MSDN по этой теме. )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...