SQL-запросы под микроскопом: как с помощью промтов превратить LLM в аналитика, который ускоряет запросы в 10 раз
Медленный SQL-запрос — это как пробка на автостраде: вроде все работает, но время уходит безвозвратно. По данным опроса Percona (2025), более 60% разработчиков сталкиваются с деградацией производительности запросов после роста данных. И тут на помощь приходят большие языковые модели (LLM). Но чтобы LLM стала настоящим аналитиком, нужны правильные промты. В этой подборке я собрал 15 проверенных шаблонов — от базовых до экспертных. Вы получите не просто список, а готовые сценарии с примерами и пояснениями. Все примеры протестированы на PostgreSQL 16.
Базовые промты: начало работы
1. Генерация SQL по описанию
Задача: быстро создать запрос с нуля.
Промт: «Ты — опытный DBA. Напиши SQL-запрос для PostgreSQL, который выводит топ-5 клиентов по сумме заказов за последний месяц. Используй таблицы customers (id, name) и orders (id, customer_id, amount, created_at).»
Пример результата:
SELECT c.name, SUM(o.amount) AS total
FROM customers c
JOIN orders o ON c.id = o.customer_id
WHERE o.created_at >= NOW() - INTERVAL '1 month'
GROUP BY c.name
ORDER BY total DESC
LIMIT 5;
Пояснение: LLM сгенерирует корректный запрос, если явно указать СУБД и схему. Без этого можно получить синтаксис MySQL.
2. Объяснение запроса
Задача: разобраться, что делает чужой SQL.
Промт: «Объясни пошагово, что делает этот запрос, и укажи возможные узкие места: [вставить запрос]».
Результат: LLM опишет каждую часть (JOIN, WHERE, GROUP BY) и укажет на отсутствие индексов.
Пояснение: полезно для ревью кода и обучения.
3. Поиск синтаксических ошибок
Задача: исправить опечатки.
Промт: «Проверь запрос на синтаксические ошибки для PostgreSQL: [запрос]. Верни исправленную версию и объясни правки».
Результат: LLM найдет пропущенную запятую или неверный алиас.
Пояснение: экономит время на отладку.
Продвинутые промты: оптимизация и индексы
4. Анализ EXPLAIN
Задача: понять, почему запрос медленный.
Промт: «Вот вывод EXPLAIN ANALYZE для запроса: [текст плана]. Определи, какие операции самые дорогие, и предложи шаги оптимизации».
Результат: LLM укажет на Seq Scan и предложит создать индекс.
Пояснение: всегда передавайте полный план, включая buffers.
5. Рекомендация индексов
Задача: ускорить выборку.
Промт: «Для таблицы orders (id, customer_id, amount, created_at, status) и запроса: SELECT * FROM orders WHERE customer_id = 5 AND status = 'paid' ORDER BY created_at DESC; предложи оптимальные индексы. Объясни, почему они помогут».
Результат:
CREATE INDEX idx_orders_customer_status_created ON orders (customer_id, status, created_at DESC);
Пояснение: составной индекс с правильным порядком колонок.
6. Переписывание запроса
Задача: заменить неэффективную конструкцию.
Промт: «Перепиши запрос, используя JOIN вместо подзапроса в WHERE, и объясни выигрыш: [запрос]».
Результат: LLM покажет эквивалентный JOIN и расскажет о производительности.
Пояснение: подзапросы часто выполняются для каждой строки.
7. Оптимизация пагинации
Задача: ускорить OFFSET.
Промт: «У меня есть запрос с OFFSET 100000 LIMIT 20. Как переписать его на keyset-пагинацию? Приведи пример для таблицы logs (id, created_at, message)».
Результат:
SELECT * FROM logs WHERE created_at > '2025-01-01' ORDER BY created_at LIMIT 20;
Пояснение: keyset-пагинация избегает сканирования всех предыдущих строк.
Экспертные промты: глубокий анализ и тюнинг
8. Поиск антипаттернов
Задача: выявить скрытые проблемы.
Промт: «Проанализируй запрос на антипаттерны (например, SELECT *, функции в WHERE, неявные приведения типов). Предложи исправления: [запрос]».
Результат: LLM перечислит проблемы и даст рекомендации.
Пояснение: экспертный взгляд на качество кода.
9. Настройка autovacuum
Задача: уменьшить bloat.
Промт: «Таблица events имеет 100 млн строк, часто обновляется. Предложи параметры autovacuum для PostgreSQL 16, чтобы избежать раздувания».
Результат: LLM порекомендует увеличить autovacuum_vacuum_scale_factor и уменьшить autovacuum_vacuum_threshold.
Пояснение: тюнинг требует понимания нагрузки.
10. Партиционирование
Задача: разбить большую таблицу.
Промт: «Как разбить таблицу sales (id, sale_date, amount) на партиции по месяцам в PostgreSQL 16? Напиши DDL и объясни преимущества».
Результат:
CREATE TABLE sales (id serial, sale_date date, amount numeric) PARTITION BY RANGE (sale_date);
CREATE TABLE sales_2025_01 PARTITION OF sales FOR VALUES FROM ('2025-01-01') TO ('2025-02-01');
Пояснение: партиционирование ускоряет запросы с фильтром по дате.
11. Использование CTE и оконных функций
Задача: упростить сложную аналитику.
Промт: «Перепиши запрос с множеством подзапросов, используя CTE и оконные функции для расчета ранга клиентов по сумме покупок: [запрос]».
Результат: LLM предложит конструкцию WITH и ROW_NUMBER().
Пояснение: повышает читаемость и производительность.
12. Кэширование на уровне приложения
Задача: снизить нагрузку на БД.
Промт: «Как кэшировать результаты тяжелого запроса в Redis? Напиши пример на Python с использованием redis-py и объясни инвалидацию кэша».
Результат: код с @cache и TTL.
Пояснение: не всегда нужно оптимизировать SQL — иногда лучше кэш.
13. Мониторинг pg_stat_statements
Задача: найти топ медленных запросов.
Промт: «Напиши запрос к pg_stat_statements, который выводит 10 самых ресурсоемких запросов по total_exec_time. Учти, что расширение установлено».
Результат:
SELECT query, calls, total_exec_time, mean_exec_time
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
Пояснение: регулярный мониторинг помогает выявлять проблемы.
14. Безопасность и SQL-инъекции
Задача: проверить запрос на уязвимости.
Промт: «Проверь, есть ли в этом запросе риск SQL-инъекции: [запрос]. Если да, покажи, как использовать параметризацию».
Результат: LLM укажет на конкатенацию строк и предложит prepared statements.
Пояснение: критично для продакшена.
15. Миграция с MySQL на PostgreSQL
Задача: адаптировать запросы.
Промт: «Переведи этот MySQL-запрос на PostgreSQL, учитывая различия в синтаксисе и функциях: [запрос]».
Результат: LLM заменит IFNULL на COALESCE, DATE_FORMAT на TO_CHAR.
Пояснение: упрощает миграцию.
Как внедрять промты в рабочий процесс
Используйте эти шаблоны как основу для собственных сценариев. Комбинируйте их: сначала сгенерируйте запрос, затем проанализируйте EXPLAIN, потом оптимизируйте. Всегда проверяйте рекомендации LLM на тестовой среде. Помните, что LLM не знает вашу схему данных и статистику — предоставляйте максимум контекста.
Экспериментируйте, делитесь результатами. Если вы хотите системно прокачать навыки работы с SQL и LLM, обратите внимание на практические курсы, где разбираются реальные кейсы оптимизации. А пока — берите эти промты и ускоряйте свои запросы уже сегодня!
Комментарии