PostgreSQL — это не просто база данных, а целая экосистема, где каждая миграция может стать головной болью. По данным Stack Overflow Developer Survey 2025, PostgreSQL четвёртый год подряд удерживает звание самой популярной СУБД среди разработчиков. Но с ростом популярности растёт и цена ошибок: медленные запросы, неудачные индексы и миграции с простоем могут стоить бизнесу тысяч долларов в час.
В этой подборке — 12 проверенных промтов, которые превращают LLM в эксперта по базам данных. Вы научитесь переписывать тяжёлые SQL-запросы, проектировать индексы, проводить zero-downtime миграции и диагностировать узкие места. Каждый промт сопровождается примером и пояснением, для каких задач он подходит. Материал ориентирован на разработчиков, аналитиков и DevOps-инженеров, знакомых с основами SQL, но желающих работать быстрее и безопаснее.
1. Переписывание медленного запроса с EXPLAIN ANALYZE
Для чего: Когда запрос выполняется секундами, а нужно понять, где именно теряется производительность.
Промт:
"Ты — эксперт по PostgreSQL. Проанализируй план выполнения запроса и предложи оптимизированный вариант. Используй вывод EXPLAIN (ANALYZE, BUFFERS). Укажи, какие операции самые дорогие, и как их устранить.
План:
<вставьте план>
Исходный запрос:
<вставьте SQL>"
Пример: Запрос с Seq Scan по таблице orders (10 млн строк) и фильтром по created_at. План показывает высокий cost. Промт помогает заменить Seq Scan на Index Scan и переписать условие.
Результат: LLM предлагает создать индекс на created_at и переписать запрос с использованием CTE для уменьшения выборки.
2. Генерация индексов под конкретные запросы
Для чего: Автоматический подбор индексов, которые ускорят часто выполняемые запросы без избыточности.
Промт:
"Ты — DBA. Проанализируй следующие SQL-запросы и предложи оптимальные индексы для PostgreSQL. Учти селективность, порядок столбцов и типы данных. Избегай дублирующих индексов.
Запросы:
1.
2.
Схема таблиц:
Пример: Два запроса: SELECT * FROM users WHERE email = 'x' AND status = 'active'; и SELECT * FROM users WHERE status = 'active' ORDER BY created_at DESC. Промт предложит композитный индекс (status, created_at) и частичный индекс для email.
Результат: Список CREATE INDEX с обоснованием.
3. Оптимизация JOIN'ов и подзапросов
Для чего: Когда запрос с множественными JOIN'ами работает медленно из-за неоптимального порядка соединений.
Промт:
"Перепиши запрос, чтобы уменьшить количество JOIN'ов или изменить их порядок. Используй EXPLAIN для проверки. Предложи альтернативы: EXISTS вместо IN, LATERAL JOIN, CTE.
Запрос:
Пример: Запрос с 5 JOIN'ами и подзапросом в WHERE. LLM предлагает заменить подзапрос на JOIN и использовать LATERAL для коррелированного подзапроса.
Результат: Новый SQL с комментариями.
4. Диагностика блокировок и deadlock'ов
Для чего: Когда транзакции блокируют друг друга, и приложение падает с ошибкой deadlock detected.
Промт:
"Проанализируй логи PostgreSQL и найди причину deadlock'а. Предложи стратегию предотвращения: изменение порядка блокировок, использование NOWAIT, таймауты.
Лог:
<текст ошибки>"
Пример: Deadlock между двумя транзакциями, обновляющими таблицы accounts и orders в разном порядке. Промт предлагает унифицировать порядок доступа.
Результат: Рекомендации по коду и настройке lock_timeout.
5. Миграция без простоя: стратегия online DDL
Для чего: Добавление столбца или индекса на продакшене без блокировки таблицы.
Промт:
"Ты — эксперт по zero-downtime миграциям в PostgreSQL. Предложи пошаговый план добавления нового столбца с значением по умолчанию и созданием индекса CONCURRENTLY. Учти ограничения блокировок.
Текущая схема:
Целевое изменение:
<описание>"
Пример: Добавление столбца last_login TIMESTAMPTZ DEFAULT NOW(). Промт предлагает: ALTER TABLE ADD COLUMN с DEFAULT NULL, затем UPDATE батчами, затем SET DEFAULT.
Результат: Скрипт миграции с шагами и проверками.
6. Партиционирование больших таблиц
Для чего: Когда таблица достигла сотен гигабайт и запросы замедлились.
Промт:
"Предложи стратегию партиционирования для таблицы <имя> по диапазону дат. Напиши DDL для создания партиций и миграции данных без простоя.
Схема:
Пример: Таблица events с 500 млн строк. Промт предлагает партиционирование по месяцам с использованием декларативного партиционирования PostgreSQL 14+.
Результат: SQL для создания партиций и переноса данных.
7. Настройка autovacuum и bloat
Для чего: Когда таблицы раздуваются, а autovacuum не успевает.
Промт:
"Проанализируй статистику pg_stat_user_tables и предложи настройки autovacuum для таблиц с высоким bloat. Укажи параметры autovacuum_vacuum_scale_factor и autovacuum_vacuum_threshold.
Статистика:
<вывод запроса>"
Пример: Таблица с 30% bloat. Промт рекомендует уменьшить scale_factor до 0.05 и увеличить workers.
Результат: Команды ALTER TABLE SET (autovacuum_vacuum_scale_factor = 0.05).
8. Анализ и оптимизация работы с JSONB
Для чего: Когда JSONB-поля используются в WHERE, но индексы не работают.
Промт:
"Предложи оптимальный индекс для запросов по JSONB-полю. Рассмотри GIN и выраженные индексы. Перепиши запрос для использования индекса.
Запрос:
Схема:
Пример: Запрос SELECT * FROM products WHERE attributes @> '{"color": "red"}'. Промт предлагает GIN-индекс на attributes.
Результат: CREATE INDEX ... USING GIN (attributes);
9. Мониторинг и поиск узких мест через pg_stat_statements
Для чего: Выявление топ-10 самых ресурсоёмких запросов.
Промт:
"Проанализируй вывод pg_stat_statements и найди запросы с высоким total_time. Предложи оптимизацию для каждого.
Вывод:
<таблица>"
Пример: Запрос с total_time 500000 мс. Промт предлагает добавить индекс и переписать.
Результат: Список рекомендаций.
10. Безопасное переименование столбца
Для чего: Переименование столбца без поломки приложения.
Промт:
"Предложи план переименования столбца <старое> в <новое> без простоя. Используй представления и постепенное обновление кода.
Схема:
Пример: Переименование user_name в username. Промт предлагает создать VIEW с новым именем, обновить приложение, затем удалить старый столбец.
Результат: Пошаговый план.
11. Генерация тестовых данных для нагрузочного тестирования
Для чего: Создание реалистичного набора данных для проверки производительности.
Промт:
"Сгенерируй INSERT-скрипт для 1 млн строк в таблицу <имя> с реалистичными данными. Учти распределение значений и связи с другими таблицами.
Схема:
Пример: Таблица users с полями name, email, created_at. Промт создаёт скрипт с случайными значениями.
Результат: SQL для генерации.
12. Перевод запроса с MySQL на PostgreSQL
Для чего: Миграция запросов между СУБД.
Промт:
"Переведи запрос с MySQL на PostgreSQL, учитывая различия в синтаксисе и функциях. Проверь на совместимость.
MySQL запрос:
Пример: Запрос с GROUP_CONCAT. Промт заменяет на STRING_AGG.
Результат: Новый SQL с пояснениями.
Сравнение подходов: ручная оптимизация vs промты
| Критерий | Ручная оптимизация | С промтами |
|---|---|---|
| Время на анализ | 2-4 часа | 15-30 минут |
| Требуемый опыт | Senior DBA | Middle разработчик |
| Риск ошибок | Средний | Низкий (с проверкой) |
| Глубина анализа | Высокая | Высокая |
Рекомендации по использованию
- Всегда проверяйте предложенные индексы на тестовой среде.
- Используйте EXPLAIN ANALYZE для валидации.
- Для миграций обязательно делайте бэкап.
- Комбинируйте промты: сначала анализ, потом оптимизация.
Эти 12 промтов покрывают 90% задач, с которыми сталкиваются разработчики и администраторы PostgreSQL. Начните с диагностики медленных запросов, затем переходите к миграциям. Помните: AI — это ускоритель, но окончательное решение всегда за вами. Экспериментируйте, измеряйте и делитесь результатами.
Источники:
- PostgreSQL Documentation: EXPLAIN
- Stack Overflow Developer Survey 2025
- PostgreSQL Wiki: Performance Optimization
Comments