Перейти до основного вмісту
Модуль 10 · Урок 2 із 438/57 у курсі~15 min
Модульні уроки (2/4)

ПОЯСНІТЬ і ПРОАНАЛІЗУЙТЕ

Ви коли-небудь замислювалися, як база даних вибирає, чи використовувати той гарний індекс, який ви щойно створили? Щойно ви натискаєте клавішу Enter у запиті (скажімо, довге приєднання до ланцюжкової групи), Планувальник запитів миттєво розраховує десятки стратегій для виконання запиту та вибирає ту, яка теоретично вважається найшвидшою.

Але як розробник, ви повинні вміти зазирнути всередину темного розуму планувальника запитів.

ПОЯСНІТЬ

Щоб дізнатися, як планує діяти планувальник, просто поставте чарівне слово EXPLAIN на початку свого запиту.

SQL
EXPLAIN SELECT * FROM orders WHERE status = 'delivered';

Результатом не будуть замовлення! Натомість ви побачите вихідний план (з приблизними статистичними даними):

Code
Seq Scan on orders  (cost=0.00..25.88 rows=15 width=40)
  Filter: (status = 'delivered'::text)

Це говорить нам:

  1. Планувальник використовуватиме Seq Scan (грубе, послідовне читання всього диска). Погано, якщо мільярди замовлень.
  2. Він оцінює, що буде повернено ~15 рядків, і обчислює «вартість» у попередньо завантажених циклах ЦП.

ПОЯСНІТЬ АНАЛІЗУЙТЕ

У той час як EXPLAIN покладається на алгоритмічні припущення (на основі глобальної статистики, обчисленої за останні кілька годин над даними), EXPLAIN ANALYZE фактично запускає запит у реальному часі (і чекає на повні логічні результати), порівнюючи реальний час, що минув, у математично абсолютних виразах.

SQL
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 90;
Code
Index Scan using idx_orders_cust on orders  (cost=0.15..8.13 rows=4 width=40) (actual time=0.012..0.015 rows=4 loops=1)
  Index Cond: (customer_id = 90)
Planning Time: 0.081 ms
Execution Time: 0.033 ms

ура! Тут ви дізнаєтеся, що база даних вирішила застосувати Сканування індексу до нашого вторинного індексу idx_orders_cust, займаючи мікроскопічний час виконання в тисячну частку секунди, пропускаючи мільйони рядків на льоту.

Ваша черга

вправи#sql.m10.l2.e1
Спроби: 0Завантаження…

Напишіть базову команду EXPLAIN, щоб дізнатися, як PostgreSQL збирається знаходити продукти з поточним запасом менше 10 одиниць. (Не використовуйте ANALYZE на цьому кроці.)

Завантаження редактора…
Показати підказку

Просто додайте слово EXPLAIN на початку існуючого оператора.

Рішення доступне після 3 спроб

Отримання правдивих показників

вправи#sql.m10.l2.e2
Спроби: 0Завантаження…

Нам потрібна справжня діагностика продуктивності (часи та цикли), а не математично вгаданий ескіз.\nВикористовуйте спеціальний оператор, щоб вивчити, фактично запустивши його, пошук УСІХ «клієнтів», які зареєструвалися до 1 січня 2025 року («signed_up_on» < «2025-01-01»).

Завантаження редактора…
Показати підказку

Додайте слово АНАЛІЗУВАТИ одразу після ПОЯСНЕННЯ.

Рішення доступне після 3 спроб