Есть ли способ отложить обновление индекса? - PullRequest
4 голосов
/ 22 января 2012

У меня есть огромная база данных, предназначенная для индексации, в которую я вставляю огромное количество информации, разбитой на тысячу кусков.Каждый раз, когда один вставляется, индекс обновляется.Проблема в том, что время, необходимое для вставки информации, становится безумно долгим после примерно 100-й или около того, из-за этих огромных транзакций, которые приводят к увеличению размера файла журнала до 300 мегабайт.

Есть ли способотложить обновление индексов (возможно, с помощью команды FREEZE INDEX или чего-то еще), в результате чего индекс останется определенным в схеме, и после того, как все таблицы будут заполнены, его можно разморозить и обновить.

Я знаючто это уже может быть достигнуто с помощью DROP INDEX и CREATE INDEX, но я искал более изящное решение или, возможно, уловку.

К сожалению, я не могу легко изменить СУБД, или я бы исследовал с помощьюPostgreSQL.

Ответы [ 2 ]

3 голосов
/ 23 января 2012

Помимо того, что это не "элегантно", есть ли другая причина, по которой вы не хотите использовать DROP INDEX / CREATE INDEX. Я предполагаю, что вы выполняете эту массовую загрузку во время планового технического обслуживания? DROP INDEX / CREATE INDEX - довольно стандартная процедура при массовой загрузке данных. Повторно создавая некластеризованные индексы в конце, вы гарантируете, что БД сможет создать наиболее эффективную структуру индекса (таким образом, выполнение запросов к данным будет выполняться быстрее).

В некоторых базах данных есть дополнительные функции, позволяющие скрыть эти детали от вас (SQL-сервер позволяет вам «отключать / включать» индекс), но за кулисами они все еще эффективно выполняют DROP INDEX / CREATE INDEX.

Опять же, вы ничего не сохраняете, даже если был "ИНДЕКС ЗАМОРАЖИВАНИЯ". Если вы вводите много данных, в любом случае лучше полностью перестроить индекс в конце (который фактически действует как «DROP INDEX / CREATE INDEX»).

Если ваш журнал становится слишком большим, возможно, вам следует разделить вставку на еще более мелкие блоки транзакций?

1 голос
/ 23 января 2012

Вы хотите выполнить вставку в транзакции (или в пакетах с транзакциями). Индекс будет обновлен после фиксации.

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