Вы когда-нибудь смотрели на execution plan и чувствовали, что смотрите в бездну? Я — да. Пока не открыл для себя промты, которые превращают сырые данные EXPLAIN ANALYZE в конкретные действия. Это не магия, а системный подход: правильный запрос к LLM экономит часы ручного анализа.
В этой статье — 15 проверенных промтов для работы с PostgreSQL. Они разделены на три уровня: базовые (для повседневных задач), продвинутые (для глубокого анализа) и экспертные (для нетривиальных случаев). Каждый промт снабжён примером и пояснением, как его использовать.
Базовые промты: ежедневная оптимизация
1. Объясни execution plan простыми словами
Задача: Понять, что делает PostgreSQL при выполнении запроса.
Промт:
Ты — эксперт по PostgreSQL. Объясни следующий execution plan простыми словами, как будто я новичок. Укажи, какие операции выполняются, какие узкие места видны, и что можно оптимизировать.
[вставьте вывод EXPLAIN ANALYZE]
Пример результата:
LLM разложит план по шагам: Seq Scan на таблице orders — это полное сканирование, которое можно заменить индексом. Hash Join — соединение через хэш-таблицу, что обычно быстро, но требует памяти.
2. Найди проблемные места в запросе
Задача: Выявить основные проблемы производительности.
Промт:
Вот SQL-запрос и его execution plan. Определи, какие части запроса являются узкими местами, и предложи конкретные улучшения: индексы, переписывание запроса, настройку параметров.
Запрос: [SQL]
Plan: [EXPLAIN ANALYZE]
Пример результата:
Модель укажет, что условие WHERE lower(email) = ... препятствует использованию индекса, и предложит создать индекс по выражению lower(email).
3. Сгенерируй индекс для медленного запроса
Задача: Получить рекомендации по индексам.
Промт:
Для таблицы [имя] с колонками [список] предложи индексы, которые ускорят следующий запрос. Учитывайте селективность и типы данных.
Запрос: [SQL]
Пример результата:
Для запроса SELECT * FROM users WHERE last_login > now() - interval '30 days' модель предложит btree-индекс на last_login.
4. Проверь, использует ли запрос индекс
Задача: Убедиться, что индекс применяется.
Промт:
Проверь execution plan на предмет использования индексов. Если индекс не используется, объясни почему и что сделать, чтобы он использовался.
[plan]
Пример результата:
LLM заметит, что из-за OR условий планировщик выбирает Seq Scan, и предложит использовать UNION ALL или GIN-индекс.
5. Перепиши запрос без подзапросов
Задача: Упростить сложный запрос.
Промт:
Перепиши следующий запрос, используя JOIN вместо подзапросов, где это возможно. Сохрани логику и убедись, что результат эквивалентен.
[SQL]
Пример результата:
Подзапрос WHERE id IN (SELECT user_id FROM orders) заменяется на JOIN orders с DISTINCT.
6. Объясни разницу между типами JOIN
Задача: Понять, какой JOIN оптимален.
Промт:
Объясни разницу между INNER JOIN, LEFT JOIN и CROSS JOIN в контексте производительности. Приведи примеры, когда каждый из них предпочтителен.
Пример результата:
Модель распишет, что CROSS JOIN может создать огромные промежуточные наборы, и её стоит избегать, если нет особой нужды.
7. Настрой параметры для конкретного запроса
Задача: Улучшить производительность через конфигурацию.
Промт:
Для следующего запроса предложи настройки PostgreSQL (work_mem, shared_buffers, effective_cache_size и т.д.), которые могут ускорить его выполнение. Обоснуй.
[SQL]
Пример результата:
LLM посоветует увеличить work_mem до 64MB для сортировки, если она выполняется на диске.
Продвинутые промты: глубокий анализ
8. Анализируй статистику таблиц
Задача: Проверить актуальность статистики.
Промт:
Выполни `ANALYZE` для таблицы [table] и покажи, как изменился план запроса. Объясни, почему свежая статистика важна.
Пример результата:
После ANALYZE план изменился с Seq Scan на Index Scan, так как оценка количества строк стала точнее.
9. Используй pg_stat_statements для поиска проблем
Задача: Найти самые медленные запросы.
Промт:
На основе данных из pg_stat_statements определи топ-5 запросов по общему времени выполнения и предложи оптимизацию для каждого.
Данные: [выборка из pg_stat_statements]
Пример результата:
Модель выделит запрос с частыми вызовами и низкой селективностью, предложит кэшировать результаты.
10. Сравни планы для разных версий
Задача: Понять, как изменится план после апгрейда.
Промт:
У меня есть execution plan из PostgreSQL 12 и из 15. Сравни их и объясни, какие улучшения планировщика привели к изменениям, и что ещё можно сделать.
План 12: ...
План 15: ...
Пример результата:
LLM отметит, что в PG 15 улучшен parallel query, поэтому план стал использовать несколько воркеров.
11. Найди запросы, блокирующие другие
Задача: Диагностика блокировок.
Промт:
Вот список активных запросов из pg_stat_activity. Определи, какие из них блокируют другие, и предложи способы устранения блокировок.
Данные: [выборка]
Пример результата:
Модель увидит долгую транзакцию, которая держит блокировку на таблице, и посоветует настроить lock_timeout.
12. Оптимизируй запросы с OR
Задача: Улучшить планы с OR-условиями.
Промт:
Запрос с OR работает медленно. Предложи альтернативы: UNION ALL, IN, или изменение структуры. Покажи на примере.
[SQL]
Пример результата:
Модель заменит WHERE a = 1 OR b = 1 на WHERE a = 1 UNION ALL WHERE b = 1 и добавит индексы на обе колонки.
13. Настрой autovacuum
Задача: Улучшить работу фоновых процессов.
Промт:
Проанализируй настройки autovacuum для таблиц с большим количеством обновлений. Предложи параметры, которые уменьшат bloat.
Пример результата:
LLM порекомендует увеличить autovacuum_vacuum_scale_factor для таблицы, чтобы vacuum запускался чаще.
14. Используй временные таблицы
Задача: Ускорить сложные вычисления.
Промт:
Для следующего многошагового запроса предложи, где можно использовать временные таблицы, чтобы избежать повторных сканирований.
[SQL]
Пример результата:
Модель предложит материализовать промежуточный результат в temp table.
15. Проверь план с помощью pg_hint_plan
Задача: Принудительно указать план.
Промт:
Используя pg_hint_plan, составь хинты для запроса, чтобы заставить PostgreSQL использовать индекс [index]. Покажи синтаксис.
[SQL]
Пример результата:
/*+ IndexScan(users users_email_idx) */ SELECT * FROM users WHERE email = '...';
Экспертные промты: нетривиальные случаи
16. Разбери параллельное выполнение
Задача: Оптимизировать параллельные запросы.
Промт:
Объясни, как настроить параллельное выполнение в PostgreSQL для конкретного запроса. Укажи параметры и их влияние.
[SQL]
Пример результата:
LLM посоветует увеличить max_parallel_workers_per_gather, если запрос сканирует большую таблицу.
17. Найди проблемы с памятью
Задача: Диагностика сортировок на диске.
Промт:
В execution plan вижу 'Sort Method: external merge Disk'. Что это значит и как исправить?
[plan]
Пример результата:
Модель объяснит, что сортировка не влезла в work_mem, и предложит увеличить его или добавить индекс.
18. Оптимизируй запросы к JSONB
Задача: Ускорить работу с JSONB.
Промт:
У меня таблица с JSONB колонкой. Какие типы индексов (GIN, BTREE) лучше использовать для запросов по ключам? Приведи примеры.
[SQL]
Пример результата:
LLM покажет, как создать GIN-индекс для @> оператора.
Выводы и рекомендации
Эти промты — не панацея, а инструмент. Главное — понимать, что LLM может ошибаться, поэтому всегда проверяйте её рекомендации на тестовых данных. Начните с базовых, постепенно переходя к экспертным, и вы заметите, как ваши запросы станут быстрее.
Попробуйте применить эти промты к своим запросам уже сегодня. И не забудьте поделиться результатами в комментариях — какие промты оказались самыми полезными?
Комментарии