Каждый день разработчики и аналитики тратят часы на однотипные задачи: придумать схему, написать сложный JOIN, разобраться, почему запрос тормозит. AI-ассистенты умеют это делать за минуты — но только если правильно составить промт. В этой статье я собрал 12 проверенных промтов для PostgreSQL и MongoDB, которые закрывают 80% ежедневных сценариев: от генерации схем до оптимизации через EXPLAIN. Каждый промт сопровождается примером использования и пояснением, когда его применять. Погнали.
Базовые промты: схемы и простые запросы
1. Генерация схемы по описанию
Когда применять: нужно быстро создать структуру таблиц или коллекций под новую фичу, не открывая документацию.
Промт:
Ты — DBA с 10-летним опытом. Спроектируй схему PostgreSQL для интернет-магазина. Таблицы: users, products, orders, order_items. Учти внешние ключи, индексы на часто используемые поля, типы данных. Добавь комментарии к каждой таблице и полю.
Пример результата:
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
-- ... остальные таблицы
Почему это работает: модель знает типовые паттерны и генерирует согласованную схему. Важно указывать СУБД и уровень детализации.
2. Написание SELECT-запроса по описанию
Когда применять: нужно быстро получить выборку по сложному условию, не вспоминая синтаксис.
Промт:
Напиши SQL-запрос для PostgreSQL: вывести топ-10 пользователей по сумме заказов за последний месяц. Учитывай только успешные заказы (status = 'completed'). В результат включи имя, email, сумму.
Пример результата:
SELECT u.name, u.email, SUM(o.total) AS total_spent
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.status = 'completed' AND o.created_at >= NOW() - INTERVAL '1 month'
GROUP BY u.id
ORDER BY total_spent DESC
LIMIT 10;
3. Объяснение чужого запроса
Когда применять: нашли сложный запрос в коде и нужно быстро понять, что он делает.
Промт:
Объясни, что делает этот SQL-запрос, простыми словами. Разбей на шаги.
[вставьте запрос]
Пример результата:
Шаг 1: Выбираем пользователей из таблицы users.
Шаг 2: Присоединяем таблицу orders по внешнему ключу.
Шаг 3: Фильтруем заказы за последние 30 дней.
...
Это экономит время на чтение документации и помогает новичкам быстрее войти в контекст.
Продвинутые промты: оптимизация и агрегации
4. Анализ плана выполнения (EXPLAIN)
Когда применять: запрос выполняется долго, нужно найти узкое место.
Промт:
Вот результат EXPLAIN ANALYZE для PostgreSQL. Проанализируй его и предложи, как ускорить запрос: какие индексы добавить, что изменить в запросе. Укажи конкретные рекомендации.
[вставьте вывод]
Пример результата:
1. Sequential Scan на users — 100k строк, фильтр по email. Рекомендация: создать индекс btree (email).
2. Hash Join — дешевле, чем Nested Loop, но можно переписать на JOIN ... USING.
...
5. Оптимизация медленного запроса без EXPLAIN
Когда применять: нет доступа к плану, но запрос тормозит.
Промт:
SQL-запрос выполняется 10 секунд. Предложи 3 способа ускорить его: оптимизация индексов, переписывание запроса, изменение схемы. Для каждого способа приведи пример кода.
[вставьте запрос]
Пример результата:
-- 1. Добавить индекс на (user_id, created_at)
CREATE INDEX idx_orders_user_created ON orders(user_id, created_at);
-- 2. Использовать UNION ALL вместо OR
-- 3. Денормализовать сумму в users.total_spent
6. Написание агрегаций MongoDB
Когда применять: нужно построить аналитический отчёт по данным в MongoDB.
Промт:
Составь aggregation pipeline для MongoDB: по коллекции orders (поля: userId, amount, status, createdAt) посчитай общую выручку по дням за последнюю неделю, только для статуса 'paid'. Отсортируй по дате.
Пример результата:
db.orders.aggregate([
{ $match: { status: 'paid', createdAt: { $gte: new Date(Date.now() - 7*24*60*60*1000) } } },
{ $group: { _id: { $dateToString: { format: '%Y-%m-%d', date: '$createdAt' } }, total: { $sum: '$amount' } } },
{ $sort: { _id: 1 } }
])
7. Генерация миграций
Когда применять: нужно изменить схему без потери данных.
Промт:
Напиши SQL-миграцию для PostgreSQL: добавить таблицу user_profiles с полями user_id, bio, avatar_url, создать внешний ключ на users. Используй IF NOT EXISTS.
Пример результата:
CREATE TABLE IF NOT EXISTS user_profiles (
user_id BIGINT PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE,
bio TEXT,
avatar_url VARCHAR(500)
);
Экспертные промты: индексы, партиционирование, сложные сценарии
8. Выбор индексов для конкретной нагрузки
Когда применять: нужно спроектировать индексы под известные паттерны запросов.
Промт:
У меня таблица events (id, user_id, event_type, created_at). Основные запросы: выборка по user_id и дате, группировка по event_type. Предложи оптимальные индексы для PostgreSQL, объясни, почему они подходят.
Пример результата:
CREATE INDEX idx_events_user_created ON events(user_id, created_at);
CREATE INDEX idx_events_type ON events(event_type);
9. Партиционирование больших таблиц
Когда применять: таблица разрослась до миллионов строк, запросы тормозят.
Промт:
Спроектируй партиционирование для таблицы logs в PostgreSQL по дате. Покажи DDL для создания партиционированной таблицы и триггер для автоматического создания партиций на месяц.
Пример результата:
CREATE TABLE logs (
id BIGSERIAL,
created_at DATE NOT NULL,
message TEXT
) PARTITION BY RANGE (created_at);
CREATE TABLE logs_2026_08 PARTITION OF logs FOR VALUES FROM ('2026-08-01') TO ('2026-09-01');
-- ... триггерная функция
10. Переписывание подзапросов в JOIN
Когда применять: запрос с подзапросами работает медленно, нужно оптимизировать.
Промт:
Перепиши этот SQL-запрос с подзапросами в JOIN, сохранив логику. Объясни, почему JOIN может быть быстрее.
[вставьте запрос]
11. Диагностика блокировок в PostgreSQL
Когда применять: приложение зависает из-за взаимных блокировок.
Промт:
Я подозреваю блокировки. Дай запрос для поиска заблокированных сессий в PostgreSQL и объясни, как их устранить.
Пример результата:
SELECT pid, state, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE wait_event_type IS NOT NULL;
12. Генерация тестовых данных
Когда применять: нужно заполнить базу для разработки.
Промт:
Сгенерируй 1000 строк для таблицы users (id, email, name) в PostgreSQL с реалистичными данными. Используй generate_series.
Пример результата:
INSERT INTO users (email, name)
SELECT 'user'
|| i || '@example.com', 'User ' || i
FROM generate_series(1, 1000) AS i;
Как выбрать подходящий промт
| Уровень | Когда использовать | Примеры промтов |
|---|---|---|
| Базовый | Новичок, быстрые задачи | 1–3 |
| Продвинутый | Оптимизация, агрегации | 4–7 |
| Экспертный | Сложные сценарии, проектирование | 8–12 |
Заключение
Эти промты — не магия, а инструмент. Они экономят часы на рутине и помогают быстрее разбираться в чужом коде. Но помните: AI ошибается, поэтому всегда проверяйте результат на тестовых данных. Начните с трёх промтов из списка, которые чаще всего пригодятся в вашей работе, и адаптируйте их под свои задачи. Удачной оптимизации!
Комментарии