Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Postgres: PostgreSQL, CREATE INDEX CONCURRENTLY, index, locking, concurrent

Что такое CREATE INDEX CONCURRENTLY?

Проверяет понимание создания индексов в PostgreSQL без блокировки таблицы на запись.

Короткий ответ

CREATE INDEX CONCURRENTLY — это команда PostgreSQL для создания индекса без блокировки таблицы на операции INSERT, UPDATE и DELETE. Обычный CREATE INDEX блокирует таблицу на запись, что может вызвать простой. CONCURRENTLY позволяет индексации выполняться в фоне, но требует больше времени и ресурсов. Подходит для production-сред, где важна непрерывная работа.

Длинный ответ

Что такое CREATE INDEX CONCURRENTLY?

В PostgreSQL создание индекса стандартной командой CREATE INDEX блокирует таблицу на запись (блокировка ACCESS EXCLUSIVE). Это означает, что все операции INSERT, UPDATE и DELETE будут ждать завершения индексации. Для больших таблиц это может привести к длительному простою приложения.

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

Как это работает?

Процесс состоит из трех фаз:

  • Начальная фаза: строится структура индекса и запускается первое сканирование таблицы для сбора данных.
  • Ожидание: система ждет завершения всех текущих транзакций, которые могли изменить данные.
  • Вторая фаза: выполняется повторное сканирование для учета изменений, произошедших во время первой фазы, и индекс финализируется.

Пример использования:

-- Обычное создание (блокирует таблицу)
CREATE INDEX idx_users_email ON users(email);

-- Без блокировки записи
CREATE INDEX CONCURRENTLY idx_users_email ON users(email);

Важные особенности

  • Команда требует больше времени и ресурсов CPU/IO, чем обычный CREATE INDEX.
  • Если процесс прервется (например, из-за ошибки), индекс останется в состоянии INVALID. Его нужно будет удалить и пересоздать.
  • Нельзя выполнять внутри транзакционного блока (BEGIN...COMMIT).
  • Подходит только для B-tree, GiST и GIN индексов (не для уникальных или первичных ключей).

Вывод

Используйте CREATE INDEX CONCURRENTLY в production-среде, когда необходимо добавить индекс на большую таблицу без остановки сервиса. Для небольших таблиц или в периоды низкой нагрузки можно использовать обычный CREATE INDEX для скорости.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Postgres

    Postgres

  • SQL

Ключевые слова

#PostgreSQL

#CREATE INDEX CONCURRENTLY

#index

#locking

#concurrent

Подпишись на Java Developer в телеграм