PostgreSQL и MongoDB под прицелом AI: 11 промтов, которые превращают медленные запросы в молниеносные
Медленный запрос в проде — это не просто раздражающий лог. Это упавший SLA, разгневанный клиент и ночной созвон в 3 утра. По данным документации PostgreSQL, планировщик выбирает план выполнения на основе статистики, собранной командой ANALYZE, и если статистика устарела — вы получаете seq scan там, где нужен index scan. В MongoDB ситуация не лучше: неверно спроектированная схема или отсутствие составного индекса превращают find() в полный перебор коллекции.
Хорошая новость: LLM-агенты научились читать EXPLAIN ANALYZE, подсказывать индексы и даже предлагать миграцию схемы. Плохая новость: без точного промта вы получите общие советы вроде «добавьте индекс». Эта подборка — набор проверенных формулировок, которые заставляют AI работать как опытный DBA.
Ниже — 11 сценариев: от диагностики медленных запросов до проектирования схем без боли. Все примеры используют реальный синтаксис PostgreSQL 16 и MongoDB 7.0. Ссылки на официальные источники прилагаются.
1. Диагностика медленного запроса через EXPLAIN ANALYZE
Проблема: запрос выполняется 8 секунд, непонятно почему.
Промт:
Ты — эксперт по PostgreSQL. Вот вывод EXPLAIN (ANALYZE, BUFFERS) для запроса:
<paste plan>
Проанализируй: где planner недооценил cardinality, какие узлы дают
наибольший actual time, есть ли seq scan по большой таблице.
Предложи конкретные индексы (с типом: btree, gin, brin) и перепиши запрос.
Результат: AI указывает на узкое место — например, Hash Join с оценкой 1 row вместо 50 000 — и предлагает CREATE INDEX CONCURRENTLY.
2. Генерация правильных индексов под workload
Проблема: таблица на 50 млн строк, запросы фильтруют по 3 колонкам.
Промт:
У меня таблица orders(user_id, status, created_at, amount).
Основные запросы:
1) WHERE user_id = ? AND status = ? ORDER BY created_at DESC
2) WHERE status = ? AND created_at > ?
Предложи минимальный набор индексов (составные + частичные),
объясни порядок колонок и почему.
Результат: AI предложит (user_id, status, created_at DESC) и частичный WHERE status = 'pending' — меньше размер, быстрее запись.
3. Переписывание N+1 в один запрос
Проблема: ORM генерирует сотни запросов.
Промт:
Вот код на SQLAlchemy с N+1 проблемой:
<paste code>
Перепиши через joinedload/selectinload или через один SQL с JOIN.
Покажи EXPLAIN до и после.
Результат: вместо 500 запросов — один с LEFT JOIN LATERAL.
4. Проектирование схемы MongoDB под реальные запросы
Проблема: данные свалены в одну коллекцию, запросы тормозят.
Промт:
Спроектируй схему MongoDB для блога: users, posts, comments, likes.
Паттерны доступа:
- лента постов с автором (10 последних)
- комментарии к посту с лайками
Используй Extended Reference Pattern и Bucket Pattern где уместно.
Объясни, почему embedding лучше referencing в каждом случае.
Результат: AI предложит embed автора в пост (данные редко меняются) и bucket для лайков.
5. Агрегационный pipeline вместо хаоса
Проблема: 5 отдельных find() вместо одного pipeline.
Промт:
Перепиши этот код MongoDB на один aggregation pipeline:
<paste code>
Используй $match в начале, $lookup только при необходимости,
добавь $facet для параллельных агрегаций. Проверь через explain('executionStats').
Результат: один round-trip к БД вместо пяти.
6. Аудит блокировок и deadlocks в PostgreSQL
Проблема: транзакции падают с deadlock detected.
Промт:
Вот лог deadlock из PostgreSQL:
<paste log>
Объясни порядок захвата блокировок, предложи порядок операций,
чтобы избежать цикла. Рассмотри advisory locks как альтернативу.
Результат: AI покажет, что две транзакции захватывают строки в разном порядке, и предложит сортировку по id.
7. Партиционирование большой таблицы
Проблема: таблица логов на 500 ГБ, VACUUM не успевает.
Промт:
Предложи стратегию партиционирования для таблицы logs(id, created_at, level, message)
с 500 ГБ данных. Сравни RANGE по created_at и HASH по id.
Покажи DDL для декларативного партиционирования PostgreSQL 16.
Результат: AI выдаст PARTITION BY RANGE (created_at) с помесячными партициями.
8. Настройка autovacuum под нагрузку
Проблема: bloat растёт быстрее, чем vacuum.
Промт:
Таблица с интенсивным UPDATE (10k/сек). Дефолтный autovacuum не справляется.
Предложи настройки per-table: autovacuum_vacuum_scale_factor,
autovacuum_vacuum_cost_limit. Объясни trade-off с I/O.
Результат: конкретные ALTER TABLE ... SET (...) вместо глобальных изменений.
9. Миграция схемы без downtime
Проблема: нужно добавить NOT NULL колонку в таблицу на 100 млн строк.
Промт:
Составь план zero-downtime миграции: добавить колонку email NOT NULL UNIQUE
в таблицу users (100 млн строк) в PostgreSQL 16.
Разбей на этапы: ADD COLUMN NULL → backfill батчами → UNIQUE INDEX CONCURRENTLY → SET NOT NULL.
Покажи SQL для каждого этапа.
Результат: пошаговый план без блокировки таблицы.
10. Оптимизация MongoDB через индексы и covered queries
Проблема: find() возвращает документы полностью, читает диск.
Промт:
Запрос: db.users.find({country: 'DE', age: {$gt: 18}}, {name: 1, email: 1, _id: 0})
Предложи индекс, который сделает его covered query.
Проверь через .explain('executionStats') — должен быть IXSCAN без FETCH.
Результат: индекс {country: 1, age: 1, name: 1, email: 1} — данные читаются прямо из индекса.
11. Сравнение подходов: SQL vs NoSQL под задачу
Проблема: неясно, что выбрать для нового сервиса.
Промт:
Сервис: аналитика событий, 1 млрд событий/месяц, запросы — агрегации по времени и user_id.
Сравни PostgreSQL (с партиционированием) и MongoDB (time series collections).
Дай таблицу: скорость записи, скорость агрегаций, стоимость хранения, сложность операций.
Результат: обоснованный выбор с учётом time series коллекций MongoDB 7.0.
Сводная таблица сценариев
| # | Сценарий | БД | Ключевой инструмент |
|---|---|---|---|
| 1 | Диагностика запроса | PostgreSQL | EXPLAIN ANALYZE |
| 2 | Индексы под workload | PostgreSQL | CREATE INDEX CONCURRENTLY |
| 3 | N+1 | Обе | JOIN / $lookup |
| 4 | Схема | MongoDB | Extended Reference Pattern |
| 5 | Агрегации | MongoDB | $facet, $match |
| 6 | Deadlocks | PostgreSQL | pg_locks, advisory locks |
| 7 | Партиционирование | PostgreSQL | PARTITION BY RANGE |
| 8 | Autovacuum | PostgreSQL | per-table settings |
| 9 | Zero-downtime миграция | PostgreSQL | CONCURRENTLY |
| 10 | Covered queries | MongoDB | IXSCAN без FETCH |
| 11 | SQL vs NoSQL | Обе | Time Series |
Официальные источники
- PostgreSQL 16 Documentation: EXPLAIN, Partitioning
- MongoDB 7.0 Manual: Aggregation Pipeline, Time Series
- Markus Winand, «Use The Index, Luke» — практическое руководство по индексам SQL
- Use of
pg_stat_statementsдля поиска топ-запросов по total_time
Все 11 промтов — шаблоны. Замените <paste plan> на реальный вывод, и AI превратится в вашего напарника-DBA. Начните с промта №1: он даёт максимальный эффект за минимум времени и сразу показывает, где именно теряются секунды.
Comments