TGViewer
yet another dev yet another dev @yet_another_dev · 382 subscribers
Post #201 368
Потоковая вставка данных в Postgres через денормализованные таблицы. Часть 2.

Это дополнение к предыдущему посту. Про SELECT будет чуть позже на этой неделе.

В прошлый раз я советовал использовать временные таблицы командой CREATE TEMP TABLE. У них есть удобный функционал автоматического удаления таблицы ON COMMIT DROP.

В процессе экспериментов и чтения документации Postgres я обнаружил другой тип таблиц: UNLOGGED. Они, как и TEMP таблицы, не используют Write-Ahead Log (WAL). То есть нет накладных расходов из-за записи в лог, но также нет и возможности восстановить данные в случае сбоя. Но, поскольку стейдж-таблица будет удалена сразу после завершения обработки данных, нам это и не нужно.

Я решил сравнить производительность трёх видов таблиц: обычные, UNLOGGED и TEMP. Я ожидал, что UNLOGGED и TEMP таблицы будут примерно одинаковыми по скорости и при этом быстрее обычных таблиц. Как оказалось, всё не так просто.

1️⃣ Если таблицы без индекса, то да, UNLOGGED и TEMP быстрее обычных таблиц (диаграмма 1) и показывают плюс-минус одинаковые результаты.

2️⃣ Ситуация меняется, если у таблиц есть индекс. Я создал индекс billing_data(resource, billing_date) include(cost). При относительно большом объёме данных (в моём случае больше 100 000 – 200 000 строк), TEMP таблицы становятся медленнее UNLOGGED таблиц и даже обычных таблиц (диаграмма 2).

Причина этого в буфере, который Postgres выделяет для временных таблиц. Размер буфера задаётся параметром temp_buffers и по умолчанию равен 8 Мб. При вставке в таблицу с индексом Postgres также должен поддерживать сам индекс в актуальном состоянии. В какой-то момент все данные перестают помещаться в буфер и Postgres начинает использовать диск. Это значительно влияет на скорость доступа к данным.

3️⃣ Чтобы проверить гипотезу, я сделал ещё один бенчмарк: вставка 1 млн строк в таблицы с индексом и разными значениями temp_buffer. Результаты (диаграмма 3) её подтверждают: с увеличением размера буфера, скорость записи в TEMP таблицы становится практически такой же, как у UNLOGGED таблиц.

Промежуточные выводы

1. Вставка в TEMP и UNLOGGED таблицы быстрее, чем в обычные таблицы.

2. Изменяя размер буфера TEMP таблиц можно влиять на скорость вставки данных.

Про индексы, UNLOGGED таблицы и их влияние на SELECT будет в следующем посте. Там тоже много чего интересного.
  • 👍 11
More from @yet_another_dev
  1. Sep 21, 2026Опубликовал вчера ролик в одной запрещённой в России соцсети про то, как сходил на выборы.…
  2. Sep 20, 2026Мы пришли в 7:50 и очередь уже была 🥲 Пообщались с другими людьми. Многие приехали из дру…
  3. Sep 19, 2026Post #383
  4. Sep 18, 2026Последние пару недель на чат нападают боты со спамом (прикрыл стикером). Поэтому чат тепер…
  5. Sep 17, 2026Что интересного в этой статье: 1. Потрачено $120К, а агенты суммарно отработали около 3-х…
  6. Sep 17, 2026В Microsoft переписали рантайм GitHub Copilot с TypeScript на Rust при помощи агентов. Под…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →