Вопрос проверяет понимание того, из чего складывается стоимость операций чтения и записи в БД и какие факторы определяют производительность.
Чаще всего INSERT дороже, потому что запись затрагивает диск, журналирование и индексы. Но SELECT тоже может быть очень дорогим, если он читает много строк, делает сортировки или соединения без индексов. Стоимость зависит от объема данных, наличия индексов, конкуренции транзакций и настроек БД. В реальных системах нужно измерять на конкретных запросах.
Нельзя универсально сказать, что всегда дороже: INSERT или SELECT. Их стоимость определяется тем, какие действия выполняет движок БД и какие ограничения (индексы, транзакции, конкуренция) присутствуют в системе.
При записи БД обычно делает:
Формирует запись в журнале (например, WAL).
Гарантирует сохранность (durability) в рамках транзакции.
Сбрасывает данные на диск по своей политике.
Даже если данные «в памяти», журналирование и fsync могут быть существенными.
Если на таблице есть индексы, INSERT приводит к:
Вставке записи в таблицу.
Вставке соответствующих ключей во все индексы.
Чем больше индексов, тем дороже вставка. Особенно дорогими могут быть уникальные индексы, потому что требуется проверка уникальности.
При высокой нагрузке INSERT может упираться в:
Блокировки на уровне строк/страниц/таблицы (зависит от БД).
Конкуренцию за ресурсы: WAL, дисковую подсистему, буферный кеш.
Контенцию на hot-страницах (например, последовательные ключи).
Вставка может включать:
CHECK/FOREIGN KEY проверки.
Триггеры.
Генерацию значений (sequence/identity).
Это добавляет CPU и дополнительные обращения к данным.
SELECT становится дорогим, если:
Читает много строк (full scan).
Возвращает много данных по сети.
Не может использовать индекс эффективно.
Дорогие операции:
ORDER BY на большом наборе.
GROUP BY с высокой кардинальностью.
JOIN больших таблиц без подходящих индексов.
SELECT может превратиться в тяжелую CPU/IO задачу, иногда заметно дороже INSERT.
В некоторых сценариях чтение может ждать:
Блокировок.
Ресурсов диска.
Конкуренции за кеш.
Ключевые факторы:
Количество и тип индексов.
Требования к durability (fsync, sync commit).
Размер выборки и селективность фильтров.
Наличие сортировок/агрегаций/JOIN.
Конкуренция транзакций и паттерны нагрузки.
Дисковая подсистема и кеширование.
Обычно:
INSERT в таблицу без индексов — относительно дешевый.
INSERT в таблицу с множеством индексов и ограничений — дорогой.
SELECT по точному ключу с индексом — очень дешевый.
SELECT с full scan + сортировка + JOIN — очень дорогой.
INSERT часто дороже из-за журналирования и обновления индексов, но SELECT может быть дороже при больших сканированиях, сортировках и JOIN. Правильный ответ в реальной системе — измерение на конкретных запросах и профиле нагрузки.