Этот вопрос проверяет знание инструментов анализа производительности запросов в базах данных.
EXPLAIN ANALYZE — это команда в PostgreSQL, которая показывает план выполнения SQL-запроса и реальную статистику его выполнения. Она фактически выполняет запрос и собирает метрики, показывая сколько времени заняла каждая операция, сколько строк было обработано и какие алгоритмы использовались. Это основной инструмент для оптимизации медленных запросов, позволяющий находить узкие места и выбирать правильные индексы.
EXPLAIN ANALYZE предоставляет детальную информацию о том, как СУБД выполняет запрос.
EXPLAIN: Показывает предполагаемый план выполнения без реального выполнения запроса
EXPLAIN ANALYZE: Выполняет запрос и показывает фактическую статистику
EXPLAIN ANALYZE
SELECT u.name, o.total
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.email LIKE '%@gmail.com';Пример вывода:
Nested Loop (cost=0.00..1250.50 rows=1000 width=64) (actual time=0.015..15.235 rows=850 loops=1)
-> Seq Scan on users u (cost=0.00..750.25 rows=1000 width=36) (actual time=0.010..5.123 rows=850 loops=1)
Filter: (email ~~ '%@gmail.com'::text)
Rows Removed by Filter: 150
-> Index Scan using idx_orders_user_id on orders o (cost=0.00..0.50 rows=1 width=28) (actual time=0.005..0.008 rows=1 loops=850)
Index Cond: (user_id = u.id)
Planning Time: 0.150 ms
Execution Time: 15.450 mscost: Предполагаемая стоимость операции (стартовая..финальная)
actual time: Фактическое время выполнения (старт..финиш)
rows: Количество обработанных строк
loops: Количество повторений операции
Rows Removed by Filter: Строки, отфильтрованные на этапе WHERE
-- Поиск проблемных мест
EXPLAIN ANALYZE
SELECT * FROM large_table
WHERE created_at > '2023-01-01'
AND status = 'active'
ORDER BY id DESC
LIMIT 100;
-- Анализ использования индексов
EXPLAIN ANALYZE
SELECT COUNT(*) FROM users
WHERE last_login > NOW() - INTERVAL '30 days';Вывод: Используйте EXPLAIN ANALYZE для анализа и оптимизации медленных запросов. Обращайте внимание на операции с высоким cost, последовательные сканирования больших таблиц и фильтры, которые удаляют много строк. Это поможет определить, где нужны индексы или переформулировка запроса.