Находит N+1, лишние джойны и отсутствующие индексы, объясняет план выполнения и переписывает запрос под вашу СУБД.
| Проблема | Симптом | Решение агента |
|---|---|---|
| N+1 в ORM | Сотни одинаковых SELECT | Eager loading, join |
| Нет индекса | Seq scan на большой таблице | CREATE INDEX по фильтру |
| SELECT * | Лишний трафик | Явный список колонок |
| Подзапрос в WHERE | Повтор вычислений | CTE или JOIN |
Запрос выполняется восемь секунд на трёх миллионах строк. Вот текст запроса и план — что оптимизировать.
Текст запроса, схему таблиц и план выполнения (EXPLAIN ANALYZE). Без плана совет будет общим.
Агент не подключается к вашей базе и не видит реальных данных: оценка идёт по схеме и плану.
-- N+1: 1 + 842 запросаSELECT * FROM orders WHERE user_id = ?; -- после: 1 запрос, 14× быстрееSELECT o.id, o.total, u.emailFROM orders oJOIN users u ON u.id = o.user_idWHERE o.created_at >= now() - interval '30 day';
Типичная ситуация: запрос, который раньше работал незаметно, начал выполняться несколько секунд, а на больших таблицах и дольше. Пример обращения: запрос идёт восемь секунд на трёх миллионах строк, есть его текст и план выполнения, нужно понять, что можно исправить. Агент читает план, находит узкое место и предлагает переписанный вариант под вашу СУБД.
Чтобы разбор был предметным, приложите текст запроса, схему таблиц и план выполнения. Важно прислать EXPLAIN ANALYZE, а не просто EXPLAIN: без фактических цифр по времени и числу строк совет будет гадательным. Отдельно назовите СУБД и её версию, потому что синтаксис индексов и доступные приёмы отличаются между PostgreSQL, MySQL, ClickHouse, MS SQL и SQLite.
Результат стоит читать вместе с исходным планом. Смотрите, на какой операции агент указал как на дорогую, и сверяйте, соответствует ли предложенная правка вашей логике фильтрации и сортировки. Переписанный SQL полезно прогнать на своей базе с EXPLAIN ANALYZE ещё раз и сравнить фактические цифры до и после, потому что агент не подключается к вашей базе и оценивает ситуацию по схеме и плану.
Проблема N+1 проявляется как сотни почти одинаковых SELECT, которые уходят в базу в цикле при обходе списка объектов. Часто это видно не в одном запросе, а в логах приложения, где для каждой строки родительской выборки идёт отдельный дочерний запрос. Если вы столкнулись именно с этим, опишите, как строится выборка, и приложите примеры генерируемых запросов.
Агент разбирает такой сценарий и предлагает подходы вроде eager loading или замены множества обращений на один join. Чтобы совет был точнее, укажите используемый фреймворк или ORM и покажите фрагмент кода, где происходит обход коллекции. Так проще понять, где именно возникает лишний цикл запросов.
Учитывайте пределы: агент видит код и план, но не наблюдает реальную нагрузку и поведение под конкретными данными. После правки полезно проверить, что число запросов действительно снизилось, по логам или профилировщику вашего приложения. Если проблема связана с архитектурой доступа к данным в целом, а не с одним местом, стоит подключить разработчика, знающего проект изнутри.
Отсутствие индекса обычно проявляется как Seq scan по большой таблице, когда база читает её целиком вместо точечного доступа. В таких случаях агент может предложить создать индекс по колонкам из фильтра. Но индекс не всегда решение: иногда быстрее переписать сам запрос, например заменить SELECT со звёздочкой на явный список колонок или вынести повторяющийся подзапрос из WHERE в CTE или JOIN.
Чтобы выбор был обоснованным, важен план с фактическими цифрами. По EXPLAIN ANALYZE видно, сколько строк реально проходит через каждую операцию и где теряется время. На основе этого агент объясняет, что даст индекс, а где он лишний и только замедлит запись. Приложите схему таблиц, чтобы было понятно, какие колонки участвуют в условиях и соединениях.
Помните, что новый индекс влияет не только на чтение. Он занимает место и замедляет вставки и обновления, поэтому решение о создании индекса стоит принимать с учётом профиля нагрузки, который известен вашей команде. Агент подсказывает направление, а окончательное внедрение на боевой базе остаётся за вами.
Кроме отдельных запросов агент делает ревью кода и ищет баги. Это полезно, когда нужно свежим взглядом пройтись по файлу перед слиянием изменений или разобраться в чужом коде. Пришлите файл целиком: за один запрос обрабатывается до 1500 строк, а замечания привязываются к конкретным строкам.
Чтобы ревью было содержательным, коротко опишите контекст: что делает модуль, какие входные данные ожидаются и что вас беспокоит. Замечания стоит читать как список гипотез для проверки, а не как готовый вердикт. Каждую правку по логике и безопасности полезно проверить на своих тестах, потому что агент не запускает код и не видит реальных данных.
Это отличается от разбора SQL-запроса: там вы приносите один запрос и план, а здесь целый файл и ожидаете построчных комментариев. Для сложных случаев, затрагивающих архитектуру всего сервиса или неочевидные бизнес-правила, ревью агента лучше рассматривать как первый проход, за которым следует обсуждение с командой. По вопросам приватности: запросы не передаются на обучение моделей, а история переписки по умолчанию не сохраняется.