Что происходит, когда мы добавляем индекс в существующую таблицу с большим объемом данных?

11

У меня есть таблица, которая будет содержать около 15 миллионов записей. Теперь мне нужно добавить индекс в таблицу.

Добавление индекса займет некоторое время для обновления каждой записи в таблице.

Я совершенно запутался, приведет ли добавление индекса к простоям.

Если да, то как я могу преодолеть время простоя?

Гарри Сурен
источник

Ответы:

10

С обычным CREATE INDEX, таблица будет заблокирована для записи, но не для чтения.

Используйте также, CREATE INDEX CONCURRENTLYчтобы избежать блокировки записи.

Из документации PostgreSQLCREATE INDEX :

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

И более конкретно (как прокомментировал @ypercube ):

PostgreSQL поддерживает построение индексов без блокировки записи . Этот метод вызывается указанием CONCURRENTLYопции CREATE INDEX. Когда используется эта опция, PostgreSQL должен выполнить два сканирования таблицы и, кроме того, он должен дождаться завершения всех существующих транзакций, которые могут потенциально использовать индекс для завершения. Таким образом, этот метод требует больше общей работы, чем стандартное построение индекса, и занимает значительно больше времени. Однако, поскольку он позволяет продолжить нормальные операции во время построения индекса, этот метод полезен для добавления новых индексов в производственной среде.

Жирный акцент мой.

Фабрицио Маззони
источник