Инструменты Оптимизации Запросов в PostgreSQL. Часть 3
3. EverSQL (ИИ-оптимизатор Запросов)
Что даёт: автоматически переписывает запросы и даёт рекомендации по индексам с использованием ИИ.
Тип: Коммерческий + Бесплатный уровень.
Базы данных: MySQL, PostgreSQL, Aurora.
Зачем нужен: Многие инженеры знают, что запросы можно оптимизировать, но не знают, как. EverSQL использует ИИ для анализа запросов и предложения конкретных оптимизаций — часто находя улучшения, которые упускают из виду люди.
Как работает:
-- Ввод: Ваш медленный запрос
SELECT o.*, c.name, c.email, p.product_name
FROM orders o
JOIN customers c ON o.customer_id = c.id
JOIN products p ON o.product_id = p.id
WHERE o.order_date >= '2024-01-01'
AND c.country = 'US'
AND o.status = 'completed'
ORDER BY o.order_date DESC
LIMIT 100;
-- Время выполнения: 45 секунд
Анализ EverSQL:
1. Отсутствует индекс
orders(order_date, status, customer_id);2. Порядок JOIN не оптимальный (примените фильтры к customers перед join).
-- Запрос, переписанный EverSQL:
WITH us_customers AS (
SELECT id, name, email
FROM customers
WHERE country = 'US'
)
SELECT o.*, c.name, c.email, p.product_name
FROM orders o
JOIN us_customers c ON o.customer_id = c.id
JOIN products p ON o.product_id = p.id
WHERE o.order_date >= '2024-01-01'
AND o.status = 'completed'
ORDER BY o.order_date DESC
LIMIT 100;
Рекомендованные индексы:
CREATE INDEX idx_orders_opt ON orders(status, order_date DESC, customer_id, product_id);
CREATE INDEX idx_customers_country ON customers(country) INCLUDE (id, name, email);
Новое время выполнения: 1.2 секунды (быстрее в 37 раз).
Когда использовать
- Сложные запросы, которые вы не до конца понимаете;
- Устаревший SQL, который «просто работает», но медленно;
- Нужны рекомендации по индексам;
- Хотите изучить методы оптимизации (ИИ объясняет ход рассуждений).
Когда отказаться
- Простые запросы (ручная оптимизация быстрее);
- Неподдерживаемые БД;
- Нужна оптимизация в реальном времени (EverSQL интерактивный/пакетный).
Скрытая функция
Помимо переписывания запросов, EverSQL анализирует схемы таблиц.
Обнаруженные проблемы:
1. Таблица 'orders' имеет 47 столбцов (слишком широкая).
Предложение: разделить на таблицы orders + order_metadata.
2. Столбец 'customer_data' имеет тип JSON (не индексируемый).
Предложение: вынести часто запрашиваемые поля в столбцы.
3. Отсутствует секционирование по 'orders' (500 млн строк).
Предложение: секционирование по order_date (ежемесячно).
Это позволяет выявлять системные проблемы, которые не могут быть исправлены модификацией запросов.
С осторожностью
Предложения ИИ нуждаются в проверке:
EverSQL предложил оптимизацию
SELECT … FROM orders
WHERE order_date >= DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)
Выглядит хорошо, но…
- В нашем случае: 80% запросов используют
order_date = CURRENT_DATE;- Индекс по
(order_date, …) лучше выражения (DATE_SUB(…));Всегда проверяйте предложения на реальных шаблонах запросов. ИИ не знает вашего конкретного распределения рабочей нагрузки.
Источник: https://medium.com/@reliabledataengineering/15-sql-optimization-tools-that-make-queries-10x-faster-8629ac451d97