Почему LLM становится вашим личным DBA
SQL — мощный, но коварный язык. Одна лишняя джойна может обрушить производительность, а неверный индекс — замедлить вставку. Хорошо, если рядом есть опытный DBA. А если нет? На помощь приходит LLM: правильно сформулированный промт превращает ChatGPT или Claude в эксперта, который разберёт план запроса, предложит индексы и перепишет JOIN'ы.
В этой подборке — 14 готовых промтов для PostgreSQL (и не только). Каждый промт — это диалог, где вы даёте контекст, а модель отвечает конкретными шагами. Мы покажем, как использовать их для анализа, оптимизации и рефакторинга. Вы получите не просто список, а систему, которая сэкономит часы работы.
Промты для анализа запросов
1. Разбор EXPLAIN ANALYZE
Задача: Понять, почему запрос выполняется медленно.
Промт:
Ты — эксперт по PostgreSQL. Проанализируй вывод EXPLAIN (ANALYZE, BUFFERS) для запроса ниже. Объясни, какие узлы плана самые дорогие, почему выбран такой план, и предложи конкретные шаги по оптимизации.
Запрос:
[вставьте SQL]
План:
[вставьте вывод EXPLAIN]
Пример: Вы получаете Seq Scan по таблице orders с 1 млн строк. Модель укажет на отсутствие индекса по полю user_id, предложит создать его и покажет, как изменится план.
2. Поиск неиспользуемых индексов
Задача: Избавиться от лишних индексов, которые замедляют запись.
Промт:
Проанализируй список индексов в PostgreSQL и определи, какие из них не используются или дублируются. Предложи, какие можно удалить без потери производительности. Учти, что некоторые индексы могут быть нужны для уникальных ограничений.
Список индексов:
[вывод pg_indexes или \di+]
Пример: Модель найдёт, что индекс по (user_id) и (user_id, created_at) дублируются, и посоветует оставить составной.
3. Оптимизация подзапросов
Задача: Переписать коррелированные подзапросы в JOIN'ы.
Промт:
Перепиши следующий SQL-запрос, заменив коррелированные подзапросы на JOIN'ы или оконные функции. Объясни, почему это может улучшить производительность. Приведи альтернативные варианты с указанием плюсов и минусов.
Запрос:
[вставьте SQL]
Пример: Запрос с WHERE EXISTS (SELECT 1 FROM orders WHERE ...) модель превратит в INNER JOIN, что часто быстрее.
Промты для рефакторинга JOIN'ов
4. Упрощение сложных JOIN'ов
Задача: Сделать запрос читаемым и быстрым.
Промт:
Ты — SQL-архитектор. Упрости следующий запрос с множеством JOIN'ов: убери лишние, перегруппируй, используй CTE для читаемости. Сохрани логику. Объясни каждое изменение.
Запрос:
[вставьте SQL]
Пример: Модель разобьёт запрос на CTE, выделив фильтрацию в отдельный шаг, что упростит отладку.
5. Замена LEFT JOIN на другие конструкции
Задача: Избежать дорогих LEFT JOIN, когда нужны только агрегаты.
Промт:
Предложи альтернативы LEFT JOIN в следующем запросе: можно ли использовать скалярный подзапрос, LATERAL JOIN или предварительную агрегацию? Сравни производительность.
Запрос:
[вставьте SQL]
Пример: Вместо LEFT JOIN (SELECT user_id, COUNT(*) FROM orders GROUP BY user_id) модель предложит LATERAL или подзапрос в SELECT, если нужно только одно значение.
6. Поиск декартовых произведений
Задача: Убрать случайные CROSS JOIN, которые раздувают результат.
Промт:
Проверь запрос на наличие неявных декартовых произведений (CROSS JOIN). Если они есть, предложи, как их устранить, добавив правильные условия соединения.
Запрос:
[вставьте SQL]
Пример: Модель найдёт, что в FROM перечислены таблицы без WHERE, и подскажет добавить JOIN.
Промты для проектирования и индексов
7. Рекомендация индексов
Задача: Создать оптимальные индексы для набора запросов.
Промт:
На основе следующих запросов и структуры таблиц предложи индексы, которые ускорят выполнение. Укажи тип индекса (B-tree, GIN, BRIN), порядок столбцов, и обоснуй выбор.
Запросы:
[список SQL]
Структура таблиц:
[DDL]
Пример: Для запросов с фильтром по статусу и сортировкой по дате модель предложит составной индекс (status, created_at).
8. Анализ блокировок
Задача: Понять, какие запросы вызывают блокировки.
Промт:
Проанализируй вывод pg_locks и pg_stat_activity. Найди запросы, которые держат блокировки, и предложи, как их избежать (например, снизить уровень изоляции или переписать запрос).
Данные:
[вставьте вывод]
Пример: Модель покажет, что долгая транзакция с UPDATE блокирует другие, и посоветует разбить её на батчи.
Промты для написания запросов
9. Генерация SQL по описанию
Задача: Быстро написать запрос с нуля.
Промт:
Напиши SQL-запрос для PostgreSQL, который [описание задачи]. Используй только стандартные функции. Добавь комментарии, поясняющие логику.
Схема БД:
[DDL]
Пример: «Выведи топ-10 пользователей по сумме заказов за последний месяц» — модель сгенерирует запрос с JOIN и GROUP BY.
10. Перевод с других диалектов
Задача: Адаптировать запрос из MySQL в PostgreSQL.
Промт:
Переведи следующий запрос с MySQL на PostgreSQL. Учти различия в синтаксисе, функциях и поведении. Укажи, что изменилось.
Запрос MySQL:
[вставьте SQL]
Пример: Модель заменит IFNULL на COALESCE, а LIMIT x, y на LIMIT y OFFSET x.
Промты для отладки и безопасности
11. Поиск SQL-инъекций
Задача: Проверить код на уязвимости.
Промт:
Проверь следующий фрагмент кода на наличие SQL-инъекций. Предложи, как переписать его с использованием параметризованных запросов.
Код:
[вставьте код]
Пример: Модель укажет на конкатенацию строк в Python и покажет, как использовать psycopg2 с параметрами.
12. Валидация сложных условий
Задача: Убедиться, что WHERE не содержит логических ошибок.
Промт:
Проанализируй условие WHERE в запросе. Проверь, нет ли противоречий, лишних скобок или неверной приоритетности операторов. Предложи исправленный вариант.
Запрос:
[вставьте SQL]
Пример: Модель заметит, что AND и OR перепутаны, и расставит скобки.
Промты для документирования
13. Генерация комментариев к запросу
Задача: Сделать код понятным для команды.
Промт:
Добавь комментарии к следующему SQL-запросу, объяснив каждый шаг: что делает каждый JOIN, зачем нужна группировка, какие фильтры применяются. Пиши кратко и по делу.
Запрос:
[вставьте SQL]
Пример: Модель разметит CTE и основные блоки, что упростит поддержку.
14. Создание DDL с комментариями
Задача: Задокументировать схему БД.
Промт:
Сгенерируй DDL для таблицы [название] с полями [список]. Добавь комментарии к каждому столбцу и ограничения целостности. Учти, что это PostgreSQL.
Описание полей:
[описание]
Пример: Модель создаст таблицу с COMMENT ON COLUMN, что полезно для новых разработчиков.
Как внедрить промты в работу
Начните с одного-двух промтов, которые закрывают вашу боль: например, разбор EXPLAIN или рефакторинг JOIN. Скопируйте шаблон, подставьте свои данные и сохраните в заметки. Со временем вы соберёте личную библиотеку промтов под свои задачи.
Помните: LLM не заменяет DBA, но становится мощным ассистентом. Проверяйте предложения на тестовой среде, измеряйте производительность до и после. Для углубления в тему оптимизации запросов и работы с индексами изучите наш Промты для код-ревью — многие принципы пересекаются.
Экспериментируйте, комбинируйте промты, и ваши запросы станут быстрее, а код — чище.