2013-09-02 3 views
27

Эффективно ли создать индекс после завершения загрузки данных или раньше, или это не имеет значения?Наиболее эффективный способ создания индекса в Postgres

Например, у меня есть 500 файлов для загрузки в DB Postgres 8.4. Вот два сценария создания сценариев, которые я мог бы использовать:

  1. Создать индекс, когда таблица создана, а затем загрузить каждый файл в таблицу; или
  2. Создайте индекс после того, как все файлы были загружены в таблицу.

Данные таблицы составляют около 45 гигабайт. Индекс составляет около 12 гигабайт. Я использую стандартный индекс. Она создается так:

CREATE INDEX idx_name ON table_name (column_name); 

Моя загрузка данных использует COPY FROM.

После того, как все файлы будут загружены, обновления, удаления или дополнительные нагрузки не будут происходить в таблице (это ценность данных дня, которая не изменится). Поэтому я хотел спросить, какой сценарий будет наиболее эффективным? Первоначальное тестирование, по-видимому, указывает на то, что загрузка всех файлов, а затем создание индекса (сценарий 2) выполняется быстрее, но я не сделал научного сравнения двух подходов.

ответ

43

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

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

Одним из недостатков создания индекса после импорта является то, что таблица должна быть заблокирована, и это может занять много времени (она не будет заблокирована в противоположном сценарии). Но в PostgreSQL 8.2 и более поздних версиях вы можете использовать CREATE INDEX CONCURRENTLY, который не блокирует таблицу при индексировании (с некоторыми оговорками).

+0

Ну, когда стол заблокирован, никто не может читать или писать, что может быть очень раздражающим, даже ночью. Вам лучше использовать CREATE INDEX CONCURRENTLY – mvp

+0

@BradTilley: Я думал, что это новая функция, но PostgreSQL 8.4 [поддерживает ее] (http://www.postgresql.org/docs/8.4/static/sql-createindex.html). – mvp

+4

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