PostgreSQL
Расширения: pgvector, PostGIS, pg_stat
Зачем хранить эмбеддинги в Pinecone, геоданные в MongoDB, логи в InfluxDB и основные данные в PostgreSQL - если всё это умеет PostgreSQL с расширениями? pgvector, PostGIS, TimescaleDB превращают одну БД в платформу, сохраняя единые транзакции, права и SQL.
- **Supabase:** pgvector как основа для semantic search и RAG-приложений - эмбеддинги хранятся рядом с данными, JOINы и RLS работают нативно без синхронизации с отдельной векторной БД
- **Uber:** PostGIS для расчёта зон surge pricing и поиска ближайших водителей; пространственные запросы к 5+ млн активных устройств за миллисекунды через GiST-индексы
- **Grafana Cloud:** TimescaleDB для 10+ млрд метрик в день; continuous aggregates позволяют рендерить годовые графики за < 100 мс без пересчёта миллиардов точек в runtime
Система расширений PostgreSQL
Расширения (extensions) - официальный механизм добавления новых типов данных, функций, индексных методов и операторов в PostgreSQL без модификации ядра. Всё устанавливается одной командой `CREATE EXTENSION` и полностью интегрируется с SQL-синтаксисом, транзакциями и правами доступа.
Расширение устанавливается в конкретную схему (по умолчанию `public`). На managed PostgreSQL (AWS RDS, Google Cloud SQL, Supabase) доступен ограниченный список расширений - не все open-source расширения разрешены провайдером. Проверь список поддерживаемых расширений в документации провайдера.
Что произойдёт при `DROP EXTENSION pgvector CASCADE` если в БД есть таблицы с колонками типа `vector`?
pgvector: векторный поиск для AI-приложений
pgvector добавляет тип `vector` для хранения эмбеддингов (числовых представлений семантики текста, изображений, аудио) и операторы для поиска ближайших соседей (ANN). Вместо отдельной векторной БД (Pinecone, Weaviate) - всё в PostgreSQL вместе с метаданными.
Supabase использует pgvector для semantic search и RAG-приложений: эмбеддинги хранятся рядом с данными в PostgreSQL, JOIN с user_id, project_id и RLS работают нативно. Это исключает проблему синхронизации данных между PostgreSQL и отдельной векторной БД.
Какой оператор pgvector следует использовать для поиска ближайших соседей с cosine similarity?
PostGIS: геопространственные данные
PostGIS - крупнейшее расширение PostgreSQL: добавляет типы geometry и geography, 1000+ геофункций, поддержку WKT/WKB/GeoJSON, пространственные индексы GiST/SP-GiST. Используется везде где нужны расстояния, полигоны, маршруты и гео-фильтры.
Uber использует PostGIS для расчёта surge pricing зон и маршрутизации. При 5+ млн активных поездок в день пространственные запросы выполняются за миллисекунды благодаря GiST-индексам. PostGIS превращает PostgreSQL в полноценную GIS-систему без дополнительного ПО.
Когда следует использовать тип `geography` вместо `geometry`?
pg_trgm: нечёткий поиск и опечатки
pg_trgm разбивает строки на триграммы (тройки символов) и на основе их перекрытия вычисляет similarity. Это позволяет находить строки с опечатками, частичным совпадением и без учёта регистра. GIN/GiST-индексы по триграммам дают быстрый поиск по `LIKE '%text%'`.
GIN-индекс по pg_trgm делает `WHERE column LIKE '%text%'` быстрым - это один из главных use cases. Обычный B-tree индекс не помогает при LIKE с ведущим `%`. На таблице с 10+ млн строк это разница между 5 секундами и 5 миллисекундами.
Запрос `WHERE name LIKE '%iphone%'` работает медленно. Какое решение ускорит его без изменения запроса?
pg_cron: планировщик задач внутри PostgreSQL
pg_cron - расширение-планировщик: выполняет SQL-запросы и функции по расписанию cron прямо внутри PostgreSQL. Не нужен внешний cron-демон, не нужно соединение с БД из внешнего скрипта - задача живёт вместе с данными.
pg_cron работает только с базой postgres (shared_preload_libraries). Задачи можно запускать в другой базе через `cron.schedule_in_database()`. Важно: при падении PostgreSQL незавершённые задачи не перезапускаются автоматически - проверяй `cron.job_run_details` для мониторинга.
В чём преимущество pg_cron перед внешним cron-скриптом, делающим подключение к PostgreSQL?
TimescaleDB: time-series поверх PostgreSQL
TimescaleDB - расширение, превращающее PostgreSQL в специализированную time-series БД. Ключевые концепции: hypertable (автоматически партиционируется по времени), continuous aggregates (автоматически обновляемые материализованные представления), политики retention и compression.
Grafana использует TimescaleDB для хранения метрик Grafana Cloud: 10+ млрд точек в день. Continuous aggregates позволяют отображать графики за год за миллисекунды - без них каждый запрос пересчитывал бы миллиарды строк. Compression снижает объём хранения в 10-20 раз.
Для time-series данных всегда нужна специализированная БД (InfluxDB, Prometheus TSDB) - PostgreSQL не справится с высоким write throughput.
TimescaleDB демонстрирует производительность на уровне или выше InfluxDB на большинстве бенчмарков при 100k+ writes/sec, с сохранением всех преимуществ PostgreSQL: SQL, JOIN, ACID, расширения.
TimescaleDB использует time-partitioned chunks для оптимизации write amplification, columnar compression для чтения и автоматические continuous aggregates - те же техники что в специализированных TSDB, но поверх PostgreSQL. В результате Grafana, Timescale Cloud, и сотни компаний хранят time-series именно в PostgreSQL+TimescaleDB, не переплачивая за дополнительную инфраструктуру.
В чём ключевое отличие TimescaleDB hypertable от обычного партиционирования PostgreSQL?
Итоги
- **pgvector:** хранение и поиск эмбеддингов прямо в PostgreSQL; HNSW-индекс для ANN-поиска; cosine `<=>`, L2 `<->`, inner product `<#>` операторы
- **PostGIS + pg_trgm:** гео-данные (geography для глобальных расстояний, GiST-индекс) и нечёткий поиск (GIN-индекс делает `LIKE '%text%'` быстрым)
- **pg_cron + TimescaleDB:** автоматизация задач по расписанию без внешних сервисов; time-series с автоматическим партиционированием, compression и continuous aggregates
Связанные темы
Расширения усиливают другие механизмы PostgreSQL:
- Полнотекстовый поиск — pg_trgm дополняет встроенный FTS: там где tsvector не справляется с опечатками, триграммный поиск находит похожие строки
- Партиционирование таблиц — TimescaleDB автоматизирует управление партициями для time-series; pg_cron автоматизирует создание партиций для стандартного партиционирования
- JSONB и GIN-индексы — pgvector добавляет новый тип данных и индексные методы (HNSW, IVFFlat) - аналогично тому как JSONB расширяет PostgreSQL через GIN
Вопросы для размышления
- Приложение хранит пользовательские эмбеддинги в Pinecone и основные данные в PostgreSQL. Какие проблемы возникают при такой архитектуре? Когда pgvector является лучшим решением?
- Таблица `products` содержит 50 млн записей. Запрос `WHERE name ILIKE '%samsung%'` занимает 8 секунд. Как ускорить без изменения SQL-запроса?
- TimescaleDB compression экономит 90% места, но делает данные read-only для INSERT/UPDATE. Для каких данных это приемлемо, а для каких - нет?