Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Postgres: insert, select, index

Что обычно дороже — операция INSERT или SELECT — и от чего это зависит?

Вопрос проверяет понимание того, из чего складывается стоимость операций чтения и записи в БД и какие факторы определяют производительность.

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

Чаще всего INSERT дороже, потому что запись затрагивает диск, журналирование и индексы. Но SELECT тоже может быть очень дорогим, если он читает много строк, делает сортировки или соединения без индексов. Стоимость зависит от объема данных, наличия индексов, конкуренции транзакций и настроек БД. В реальных системах нужно измерять на конкретных запросах.

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

Нельзя универсально сказать, что всегда дороже: INSERT или SELECT. Их стоимость определяется тем, какие действия выполняет движок БД и какие ограничения (индексы, транзакции, конкуренция) присутствуют в системе.

Почему INSERT часто бывает дорогим

1. Журналирование и долговечность

При записи БД обычно делает:

  1. Формирует запись в журнале (например, WAL).

  2. Гарантирует сохранность (durability) в рамках транзакции.

  3. Сбрасывает данные на диск по своей политике.

Даже если данные «в памяти», журналирование и fsync могут быть существенными.

2. Обновление индексов

Если на таблице есть индексы, INSERT приводит к:

  1. Вставке записи в таблицу.

  2. Вставке соответствующих ключей во все индексы.

Чем больше индексов, тем дороже вставка. Особенно дорогими могут быть уникальные индексы, потому что требуется проверка уникальности.

3. Конкуренция и блокировки

При высокой нагрузке INSERT может упираться в:

  1. Блокировки на уровне строк/страниц/таблицы (зависит от БД).

  2. Конкуренцию за ресурсы: WAL, дисковую подсистему, буферный кеш.

  3. Контенцию на hot-страницах (например, последовательные ключи).

4. Триггеры и ограничения

Вставка может включать:

  1. CHECK/FOREIGN KEY проверки.

  2. Триггеры.

  3. Генерацию значений (sequence/identity).

Это добавляет CPU и дополнительные обращения к данным.

Почему SELECT тоже может быть дорогим

1. Объем читаемых данных

SELECT становится дорогим, если:

  1. Читает много строк (full scan).

  2. Возвращает много данных по сети.

  3. Не может использовать индекс эффективно.

2. Сортировки, агрегации и JOIN

Дорогие операции:

  1. ORDER BY на большом наборе.

  2. GROUP BY с высокой кардинальностью.

  3. JOIN больших таблиц без подходящих индексов.

SELECT может превратиться в тяжелую CPU/IO задачу, иногда заметно дороже INSERT.

3. Конкуренция и блокировки на чтении

В некоторых сценариях чтение может ждать:

  1. Блокировок.

  2. Ресурсов диска.

  3. Конкуренции за кеш.

От чего зависит “что дороже” на практике

Ключевые факторы:

  1. Количество и тип индексов.

  2. Требования к durability (fsync, sync commit).

  3. Размер выборки и селективность фильтров.

  4. Наличие сортировок/агрегаций/JOIN.

  5. Конкуренция транзакций и паттерны нагрузки.

  6. Дисковая подсистема и кеширование.

Практические эвристики

Обычно:

  1. INSERT в таблицу без индексов — относительно дешевый.

  2. INSERT в таблицу с множеством индексов и ограничений — дорогой.

  3. SELECT по точному ключу с индексом — очень дешевый.

  4. SELECT с full scan + сортировка + JOIN — очень дорогой.

Вывод

INSERT часто дороже из-за журналирования и обновления индексов, но SELECT может быть дороже при больших сканированиях, сортировках и JOIN. Правильный ответ в реальной системе — измерение на конкретных запросах и профиле нагрузки.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • Postgres

    Postgres

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

#insert

#select

#index

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

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.