SQL под контролем AI: 12 промтов для ускорения запросов, индексов и миграций PostgreSQL

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 разработчик
Риск ошибок Средний Низкий (с проверкой)
Глубина анализа Высокая Высокая

Рекомендации по использованию

  1. Всегда проверяйте предложенные индексы на тестовой среде.
  2. Используйте EXPLAIN ANALYZE для валидации.
  3. Для миграций обязательно делайте бэкап.
  4. Комбинируйте промты: сначала анализ, потом оптимизация.

Эти 12 промтов покрывают 90% задач, с которыми сталкиваются разработчики и администраторы PostgreSQL. Начните с диагностики медленных запросов, затем переходите к миграциям. Помните: AI — это ускоритель, но окончательное решение всегда за вами. Экспериментируйте, измеряйте и делитесь результатами.

Источники:
- PostgreSQL Documentation: EXPLAIN
- Stack Overflow Developer Survey 2025
- PostgreSQL Wiki: Performance Optimization

← All posts

Comments