10 промтов для написания SQL запросов и оптимизации БД

Введение

SQL остаётся одним из самых востребованных навыков в разработке, но даже опытные инженеры тратят часы на отладку сложных запросов и поиск узких мест в производительности. С появлением больших языковых моделей (LLM) в 2026 году написание и оптимизация SQL стали значительно быстрее — если знать правильные промты. В этой подборке я делюсь 10 проверенными промтами, которые использую ежедневно для генерации запросов, рефакторинга и анализа планов выполнения. Каждый пример — из реальных проектов, с пояснениями, как адаптировать под вашу схему.

1. Генерация базового SELECT с JOIN

Промт:

Напиши SQL запрос для PostgreSQL, который выбирает из таблицы orders все заказы пользователей из таблицы users, где сумма заказа больше 1000. Используй INNER JOIN. Выведи: имя пользователя, email, дату заказа и сумму. Отсортируй по сумме по убыванию.

Результат:

SELECT u.name, u.email, o.order_date, o.total_amount
FROM orders o
INNER JOIN users u ON o.user_id = u.id
WHERE o.total_amount > 1000
ORDER BY o.total_amount DESC;

Совет: Всегда указывайте СУБД (PostgreSQL, MySQL, SQLite) — это влияет на синтаксис и доступные функции. Добавляйте пример данных или структуру таблиц, если запрос сложный.

2. Оптимизация медленного запроса с EXPLAIN ANALYZE

Промт:

У меня есть медленный запрос к PostgreSQL. Вот его план выполнения (EXPLAIN ANALYZE): [вставьте план]. Запрос: [вставьте запрос]. Определи узкие места и предложи оптимизации: индексы, переписывание, изменение join-стратегии. Объясни каждую рекомендацию.

Пример использования:
Допустим, план показывает Seq Scan на таблице с миллионом строк. AI предложит добавить индекс на столбец, используемый в WHERE, или заменить JOIN на EXISTS.

3. Рефакторинг хранимой процедуры

Промт:

Перепиши эту хранимую процедуру на PostgreSQL, чтобы она работала быстрее. Убери курсоры, используй set-based операции. Вот текущий код: [вставьте код]. Добавь комментарии к изменениям.

Пример:
Курсор, обновляющий строки по одной, заменяется на UPDATE с подзапросом. AI может предложить использовать CTE или оконные функции.

4. Создание индексов по шаблону запросов

Промт:

У меня есть таблица transactions с колонками: id, user_id, amount, created_at, status. Вот три самых частых запроса:
1. SELECT * FROM transactions WHERE user_id = ? AND status = 'completed';
2. SELECT SUM(amount) FROM transactions WHERE created_at BETWEEN ? AND ?;
3. SELECT * FROM transactions ORDER BY created_at DESC LIMIT 100;
Предложи набор индексов (включая составные), которые ускорят эти запросы. Объясни, почему каждый индекс нужен.

Результат:
- Составной индекс на (user_id, status) для первого запроса.
- Индекс на (created_at) для второго и третьего.
- Возможно, частичный индекс для первого.

5. Генерация запроса с оконными функциями

Промт:

Напиши SQL запрос для PostgreSQL, который для каждого пользователя из таблицы users показывает последние 5 заказов из таблицы orders. Используй ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_date DESC). Выведи: user_id, name, order_id, order_date, total_amount.

Результат:

WITH ranked AS (
  SELECT u.id AS user_id, u.name, o.id AS order_id, o.order_date, o.total_amount,
         ROW_NUMBER() OVER (PARTITION BY u.id ORDER BY o.order_date DESC) AS rn
  FROM users u
  INNER JOIN orders o ON u.id = o.user_id
)
SELECT user_id, name, order_id, order_date, total_amount
FROM ranked
WHERE rn <= 5;

6. Диагностика блокировок и deadlock

Промт:

В PostgreSQL возник deadlock. Вот лог: [вставьте лог]. Объясни причину и предложи способ предотвратить: порядок блокировок, таймауты, уровень изоляции. Напиши запрос для поиска текущих блокировок.

Пример ответа:
AI объяснит, что deadlock часто возникает при разном порядке обновления строк. Предложит применить pg_blocking_pids() и использовать NOWAIT.

7. Преобразование плохого запроса в эффективный

Промт:

Этот запрос выполняется 10 секунд. Перепиши его без подзапросов в SELECT, используй JOIN или LATERAL. Вот текущий запрос: [вставьте]. Объясни, почему подзапросы в SELECT медленные.

Теория:
Коррелированные подзапросы выполняются для каждой строки внешнего запроса. Замена на JOIN с группировкой или LATERAL может сократить время.

8. Создание тестовых данных

Промт:

Сгенерируй SQL скрипт для PostgreSQL, который заполняет таблицу products 1000 случайными записями. Колонки: id (serial), name (varchar(100)), price (decimal между 10 и 500), created_at (timestamp за последний год). Используй generate_series и random().

Результат:

INSERT INTO products (name, price, created_at)
SELECT 
  'Product ' || i,
  round((random() * 490 + 10)::numeric, 2),
  now() - (random() * interval '365 days')
FROM generate_series(1, 1000) AS i;

9. Анализ использования индексов

Промт:

Напиши запрос, который показывает все индексы в схеме public базы PostgreSQL, их размер, количество сканирований и процент использования. Отсортируй по размеру. Используй pg_stat_user_indexes и pg_indexes.

Результат:

SELECT
  relname AS table_name,
  indexrelname AS index_name,
  pg_size_pretty(pg_relation_size(indexrelid)) AS index_size,
  idx_scan AS number_of_scans,
  CASE WHEN idx_scan > 0 THEN 'Used' ELSE 'Unused' END AS status
FROM pg_stat_user_indexes
ORDER BY pg_relation_size(indexrelid) DESC;

10. Генерация документации по схеме

Промт:

На основе этой схемы базы данных (список таблиц и колонок) создай описание на русском для документации: для каждой таблицы — назначение, ключевые колонки, связи с другими таблицами. Формат: Markdown.

Пример:

### Таблица `orders`
- **Назначение**: Хранит заказы пользователей.
- **Ключевые колонки**:
  - `id` (PK) — уникальный идентификатор заказа.
  - `user_id` (FK → users.id) — пользователь, сделавший заказ.
  - `total_amount` — общая сумма заказа.
- **Связи**: один заказ может иметь много строк в `order_items`.

Заключение

Эти 10 промтов покрывают 90% повседневных задач: от написания новых запросов до глубокой оптимизации. Главное — давать модели контекст: тип СУБД, схему, пример данных и ожидаемый результат. Со временем вы научитесь формулировать промты так, чтобы получать готовый код без правок. Помните: AI — это ассистент, а не замена. Всегда проверяйте сгенерированные запросы на тестовой базе, особенно если они затрагивают продуктивные данные.

Если вы хотите научиться интегрировать SQL-генерацию в свои проекты или автоматизировать рутину, обратите внимание на курсы, где разбираются реальные кейсы и даются готовые шаблоны промтов.

← Все статьи

Комментарии