Выбор ответа Middle EXPLAIN и оптимизация обновлено

Сколько строк вернул параллельный скан

Вопрос

Запрос с фильтром по дню. Таблица orders на 1 млн строк, customers на 50 тыс., PostgreSQL 16. Сколько строк в сумме вернул узел Parallel Seq Scan?

Gather  (cost=1000.00..16199.67 rows=5000 width=32) (actual time=18.035..56.183 rows=2880 loops=1)
  Workers Planned: 2
  Workers Launched: 2
  ->  Parallel Seq Scan on orders  (cost=0.00..14699.67 rows=2083 width=32) (actual time=20.416..43.039 rows=960 loops=3)
        Filter: (date((created_at AT TIME ZONE 'UTC'::text)) = '2024-03-01'::date)
        Rows Removed by Filter: 332373
Planning Time: 0.477 ms
Execution Time: 56.398 ms

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: 2880: rows даны на цикл, циклов 3. В EXPLAIN ANALYZE поля actual rows и time показываются в среднем на один цикл (loops).

Варианты ответа

  1. 960: это число в actual ... rows
  2. 5000: это оценка у узла Gather
  3. 332 373: столько строк узел обработал
  4. 2880: rows даны на цикл, циклов 3правильный ответ

Разбор

В EXPLAIN ANALYZE поля actual rows и time показываются в среднем на один цикл (loops). Параллельный скан выполнялся в трёх процессах: 2 запущенных воркера плюс ведущий процесс, который тоже читает данные (parallel_leader_participation включён по умолчанию). Итого 960 × 3 = 2880, и ровно столько же показывает Gather. Значение 5000 это оценка планировщика, а не факт. Rows Removed by Filter: 332373 тоже на цикл: это строки, отброшенные фильтром, а не возвращённые.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме