Нейросеть для SQL: как писать и оптимизировать запросы с ИИ
Схема, пример данных и план запроса в запросе к модели, проверка через EXPLAIN и доступ только на чтение. Рабочий код на Python и расчёт стоимости.
6 мин · · разработка · API-ключи
Нейросеть для программирования на SQL умеет писать запросы по описанию и объяснять, почему запрос медленный. Но без схемы базы она угадывает имена таблиц, а без проверки может выдать запрос, который работает, но возвращает не то. Хуже всего, если сгенерированный UPDATE или DELETE попадёт в рабочую базу. Ниже порядок работы, который уменьшает эти риски: что передавать модели, как проверять запрос через EXPLAIN и как ограничить доступ.
Пайплайн «вопрос на русском, SQL в ответ» для отчётных интерфейсов разобран в статье генерация SQL запросов нейросетью. Здесь акцент на другом: ежедневная работа разработчика и аналитика, оптимизация и безопасность.
Нейросеть для программирования на SQL: что передавать модели
Запрос «напиши SQL для топ-10 клиентов по выручке» без контекста даст запрос по выдуманным таблицам. Передавайте четыре вещи:
- СУБД и версия. PostgreSQL 16, MySQL 8, SQLite: функции дат, оконные функции и
LIMITотличаются. - Схема. Лучше всего подходят
CREATE TABLEвместе с ключами, ограничениями и индексами. Модель видит типы и связи. - Несколько строк примера. Две-три обезличенные строки на таблицу. Они показывают формат значений: статусы строками, даты как текст или
timestamp, как записаны суммы. - Размеры таблиц. Порядок количества строк. Для оптимизации это важнее, чем кажется: для таблицы на сто строк индекс не нужен.
Выгрузить схему можно штатными средствами вашей СУБД (например, pg_dump --schema-only для PostgreSQL). Не отправляйте реальные данные клиентов: структуры и обезличенных примеров достаточно.
Шаблон запроса
СУБД: PostgreSQL 16.
Схема:
CREATE TABLE orders (id bigint PRIMARY KEY, customer_id bigint NOT NULL,
status text NOT NULL, created_at timestamptz NOT NULL, total numeric(12,2));
CREATE INDEX orders_customer_idx ON orders (customer_id);
CREATE TABLE customers (id bigint PRIMARY KEY, name text, region text);
Объём: orders около 40 млн строк, customers около 800 тыс.
Статусы: 'new', 'paid', 'cancelled'.
Задача: выручка по регионам за октябрь 2026 по оплаченным заказам.
Требования: только SELECT, границы месяца без BETWEEN по timestamp,
пояснение логики в одном абзаце после запроса.Две детали, которые экономят правки: явно перечисляйте допустимые значения статусов (иначе модель придумает completed) и просите границы дат в виде >= '2026-10-01' AND < '2026-11-01'. Типичная ошибка с BETWEEN на timestamp теряет последний день.
Проверка: EXPLAIN вместо веры
Читаемый на вид запрос может оказаться полным сканированием 40 миллионов строк. Поэтому у каждого сгенерированного запроса есть этап плана:
EXPLAINпоказывает план без выполнения запроса. Начинайте с него.EXPLAIN (ANALYZE, BUFFERS)в PostgreSQL выполняет запрос по-настоящему и показывает фактическое время. ДляSELECTэто безопасно с таймаутом и на реплике, но для запросов, меняющих данные,ANALYZEих выполнит, поэтому такие запросы на нём не гоняйте. Синтаксис и вывод в MySQL и других СУБД отличаются, сверяйтесь с документацией вашей.
Дальше хорошо работает цикл «запрос, план, объяснение»: отправляете модели исходный запрос и вывод плана, просите объяснить узкое место и предложить варианты (перепись запроса, индекс), а затем проверяете каждый вариант на копии базы. Предлагаемый индекс создаёт человек через обычную миграцию, а не скрипт с моделью.
Защита базы: четыре барьера
Код ниже показывает связку барьеров для сгенерированных SELECT-запросов:
import os
import psycopg
import sqlglot
from sqlglot import exp
from openai import OpenAI
client = OpenAI(base_url="https://api.zukko.pro/v1",
api_key=os.environ["ZUKKO_API_KEY"])
def generate_sql(schema, task):
resp = client.chat.completions.create(
model="claude-sonnet-5-5",
messages=[
{"role": "system", "content": "Ты помощник по PostgreSQL 16. "Барьеры по порядку:
- Разбор запроса.
sqlglotпроверяет, что оператор один и этоSELECT, а неSELECT 1; DROP TABLE .... Это синтаксическая проверка: побочные эффекты функций она не поймает, поэтому следующий барьер обязателен. - Роль только на чтение. Строка подключения использует пользователя СУБД, у которого есть лишь
SELECTна нужные таблицы. Это главный барьер: он работает, даже если все остальные проверки обойдены. - Транзакция только на чтение и таймаут. Запрос не сможет изменить данные и не займёт базу надолго.
- Выполнение на реплике или копии. Тяжёлые аналитические запросы не должны мешать рабочей нагрузке.
Если модель просили исправлять данные, это отдельная задача: модель выдаёт скрипт, человек читает, прогоняет на копии, оборачивает в транзакцию и запускает сам.
Типичные ошибки, которые стоит искать
- Дубли после JOIN. Соединение с таблицей «один ко многим» умножает строки, и
SUMвыдаёт завышенную сумму. NOT INс NULL. Подзапрос возвращает NULL, и условие перестаёт срабатывать. Часто нуженNOT EXISTS.- Функции другой СУБД. Модель путает
DATE_TRUNC,STRFTIME,DATEADD, если не указан диалект. - Неявное приведение типов, из-за которого индекс не используется.
SELECT *в боевых запросах и сортировка безLIMIT.
Сверяйте результат с контрольными числами: сделайте запрос руками на небольшом срезе и сравните итог. А при оптимизации сравнивайте результаты старого и нового запроса на копии, например, через EXCEPT в обе стороны: пустой результат в обоих направлениях означает совпадающие наборы строк.
Какую модель выбрать
Для простых запросов хватает недорогих моделей, сложную аналитику с оконными функциями и оптимизацию планов стоит прогнать на нескольких. Составьте 15–20 своих запросов с известными ответами и сравните. Цены Zukko на 18 октября 2026 ($ за 1M токенов, вход / выход) и индекс силы:
| Модель | Цена | Индекс силы |
|---|---|---|
deepseek-v4.1-flash | 0.013 / 0.038 | 39 |
gpt-6.1-sol | 0.27 / 1.32 | 52 |
claude-sonnet-5-5 | 0.4 / 2 | 48 |
claude-opus-5-5 | 0.8 / 4 | 58 |
Индекс не измеряет качество SQL именно на вашей схеме, это ориентир. Подборка про выбор модели для кода: лучшая нейросеть для программирования.
Сколько стоит
Формула: (вход × цена входа + выход × цена выхода) / 1 000 000. Допущения: запрос с оптимизацией, 3 000 токенов схемы, 100 токенов вопроса, 800 токенов плана, итого 3 900 токенов входа и 500 токенов выхода.
deepseek-v4.1-flash: 3 900 × 0.013 / 1 000 000 + 500 × 0.038 / 1 000 000 = 0.0000507 + 0.000019, около $0.00007.gpt-6.1-sol: 3 900 × 0.27 / 1 000 000 + 500 × 1.32 / 1 000 000 = 0.001053 + 0.00066, около $0.0017.claude-sonnet-5-5: 0.00156 + 0.001, около $0.0026.claude-opus-5-5: 0.00312 + 0.002, около $0.0051.
Двадцать таких запросов в день на claude-sonnet-5-5 это около $0.05. Схема повторяется в каждом запросе, поэтому при частых обращениях выгодно кэшировать её: скидку за кэш для Claude даёт Anthropic-формат, подробности в статье кэширование промптов: чтение и запись. Свежие цены всегда в ответе GET https://api.zukko.pro/v1/models.
Подключение
Создайте ключ в кабинете, укажите base URL https://api.zukko.pro/v1 и подключайтесь по справке chat completions. Баланс пополняется от $1: СБП (платёжная страница добавляет 8,5% сверху), криптовалюта или карта MasterCard.
Частые вопросы
Можно ли дать нейросети доступ к базе напрямую?
Только с ролью, у которой есть право на чтение нужных таблиц, и лучше на реплике. Права на запись модели не давайте никогда.
Как нейросеть для генерации кода SQL узнает схему?
Только из вашего запроса. Передайте CREATE TABLE с индексами и примеры строк, иначе она будет угадывать имена.
Правда ли, что модель оптимизирует запросы?
Она предлагает варианты по плану, который вы ей показали. Эффект проверяется на копии базы, а индекс создаёт человек.
Как проверить, что оптимизированный запрос возвращает то же самое?
Сравните результаты двух запросов на копии через EXCEPT в обе стороны и проверьте итоговые суммы.
zukko
Платите в 25×
меньше
за Claude Code & ChatGPT
Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.
Похожие статьи
- Свой прокси к нейросети на Node.js: не показывать API-ключ во фронтендеНебольшой сервер на Express между вашим фронтендом и API нейросети: ключ остаётся на сервере, а модели, длина запроса и частота ограничены.
- DeepSeek API на Python: запросы, стриминг, JSON и обработка ошибокГотовый код для DeepSeek V4.1 Flash и V4 Pro на OpenAI SDK: запрос, стриминг, разбор JSON и аккуратная обработка ошибок.
- Gemini API на Python: запросы через OpenAI SDK и OpenAI-форматРабочий пример Gemini API на Python без отдельной библиотеки: меняем base_url в OpenAI SDK, добавляем стриминг и JSON и сравниваем с google-genai.
- Anthropic SDK для Python: base_url, ключ и первый запрос через шлюзОфициальный пакет anthropic для Python нужно только направить на другой адрес. Разбираем base_url, ключ, стриминг, подсчёт токенов, кэш и ошибки.