- Зачем:
- бенчмарк на i7-11800H / WSL2 показал, что jobs=1 генерирует +1 день за ~3 мин,
а jobs=2 — за ~9 мин из-за lock contention на gen.events FOR UPDATE SKIP LOCKED.
Тюнинг PG (shared_buffers, work_mem) и synchronous_commit=off не влияют.
- Что:
- дефолт BOOKINGS_JOBS изменён с 2 на 1 в Makefile и .env.example.
- добавлен docs/internal/bookings_generation_benchmark.md с полной матрицей экспериментов.
- обновлены комментарии и bookings/README.md.
- Проверка:
- make bookings-init && time make bookings-generate-day (~3 мин).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
52 lines
3.9 KiB
Markdown
52 lines
3.9 KiB
Markdown
# Демобаза bookings в Postgres
|
||
|
||
Этот каталог используется для работы с демобазой [bookings](https://postgrespro.ru/education/demodb), которая будет источником данных для будущего DWH в Greenplum.
|
||
|
||
На первом этапе мы:
|
||
- поднимаем отдельный контейнер `bookings-db` с Postgres;
|
||
- инициализируем демобазу одним из двух способов (см. ниже);
|
||
- генерируем данные «день за днём» с помощью `make`‑команд.
|
||
|
||
### Два способа инициализации
|
||
|
||
| Команда | Что делает | Время | Для кого |
|
||
|---------|-----------|-------|----------|
|
||
| `make bookings-init` | Быстрое восстановление из seed-дампа | ~18 сек | **Студенты** (рекомендуется по умолчанию) |
|
||
| `make bookings-generate` | Полная генерация с нуля через генератор demodb | часы | Разработчики, пересоздание дампа |
|
||
|
||
Основные команды см. в корневом `Makefile` (`bookings-init`, `bookings-generate`, `bookings-generate-day`, `bookings-psql`) и в `README.md` проекта.
|
||
|
||
## Источник и версия
|
||
- Репозиторий демобазы: `postgrespro/demodb`.
|
||
- Закреплённый коммит: `866e56f7` (см. `DEMODB_COMMIT` в корневом `Makefile`).
|
||
|
||
## Что мы патчим в demodb
|
||
- `install.sql`: `DROP DATABASE IF EXISTS demo WITH (FORCE)` — установка не падает, даже если демобазу держат активные сессии (например, из Airflow).
|
||
- `engine.sql`: два изменения в `engine_jobs1_sync.patch`:
|
||
- `busy()` игнорирует свой `pid`, чтобы не считать собственное подключение занятым;
|
||
- `continue()` при `jobs=1` вызывает `process_queue` синхронно (без `dblink`), иначе генерация обрывается при выходе из `psql` и данных не появляется.
|
||
- `install.sql`: удалён хардкод `gen.connstr` без credentials (`install_connstr_no_hardcode.patch`).
|
||
- Дефолт: `BOOKINGS_JOBS=1` (синхронно, без dblink — оптимально для +1 дня, ~3 мин). При `jobs>1` — через dblink, но на WSL2 в 3× медленнее из-за lock contention на `gen.events`.
|
||
- Патчи применяются автоматически в `make bookings-generate` (генерация с нуля). Если что-то пошло не так, их можно накатить вручную:
|
||
```
|
||
patch -d bookings/demodb -p1 --forward < bookings/patches/install_drop_if_exists.patch
|
||
patch -d bookings/demodb -p1 --forward < bookings/patches/engine_jobs1_sync.patch
|
||
```
|
||
|
||
## Быстрая проверка после init/обновления
|
||
- `make bookings-init` (восстановление из дампа) должен завершиться без ошибок; в `bookings.bookings` ожидаем >0 строк (примерно 15k).
|
||
- `make bookings-generate` (генерация с нуля) тоже должен дать >0 строк, но занимает значительно больше времени.
|
||
- `make bookings-generate-day` добавляет следующий день после `max(book_date)`.
|
||
- Ручной вызов генерации из psql/DBeaver — только через DO-блок (подзапрос в аргументах `CALL` не работает):
|
||
```sql
|
||
DO $$
|
||
DECLARE
|
||
v_next_day timestamptz;
|
||
BEGIN
|
||
SELECT date_trunc('day', max(book_date)) + interval '1 day'
|
||
INTO v_next_day
|
||
FROM bookings.bookings;
|
||
CALL continue(v_next_day, 1);
|
||
END $$;
|
||
```
|