Перейти к содержимому

24. Query Optimization: EXPLAIN

EXPLAIN показывает план выполнения запроса.

EXPLAIN SELECT * FROM users WHERE email = '[email protected]';
EXPLAIN ANALYZE
SELECT u.username, COUNT(p.id) as post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.id, u.username;
  • Seq Scan: Полное сканирование таблицы (медленно!)
  • Index Scan: Использует индекс (быстро)
  • Nested Loop: JOIN через вложенный цикл
  • Hash Join: JOIN через хеш-таблицу
  • Cost: Оценка стоимости (относительная)
  • Rows: Ожидаемое количество строк
EXPLAIN ANALYZE
SELECT * FROM orders WHERE status = 'pending';
-- Результат:
Seq Scan on orders (cost=0.00..1523.00 rows=150 width=128) (actual time=0.045..12.389 rows=142 loops=1)
Filter: (status = 'pending'::text)
Rows Removed by Filter: 9858
Planning Time: 0.123 ms
Execution Time: 12.456 ms

Проблема: Seq Scan! Нужен индекс.

CREATE INDEX idx_orders_status ON orders(status);
-- Теперь:
Index Scan using idx_orders_status on orders (cost=0.29..8.31 rows=142 width=128) (actual time=0.021..0.089 rows=142 loops=1)

Следующий урок: Index Strategies