Как читать loops во вложенном цикле
Вопрос
Запрос соединяет 4 клиента с их заказами. Сколько раз выполнялся узел Bitmap Heap Scan on orders и сколько строк он вернул суммарно?
Nested Loop (cost=4.87..336.02 rows=80 width=25) (actual time=0.066..0.424 rows=80 loops=1)
-> Index Scan using customers_pkey on customers c (cost=0.29..8.37 rows=4 width=22) (actual time=0.006..0.007 rows=4 loops=1)
Index Cond: ((id >= 100) AND (id <= 103))
-> Bitmap Heap Scan on orders o (cost=4.58..81.71 rows=20 width=11) (actual time=0.021..0.099 rows=20 loops=4)
Recheck Cond: (c.id = customer_id)
Heap Blocks: exact=80
-> Bitmap Index Scan on orders_customer_id_idx (cost=0.00..4.58 rows=20 width=0) (actual time=0.015..0.015 rows=20 loops=4)
Index Cond: (customer_id = c.id)
Planning Time: 0.763 ms
Execution Time: 0.479 ms
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- 1 раз, 20 строк на всех клиентов
- 4 раза, 20 строк суммарно
- 4 раза по 20 строк, всего 80правильный ответ
- 80 раз, по одной строке за раз
Разбор
Nested Loop для каждой строки внешнего узла (4 клиента) запускает внутренний узел заново, поэтому у внутреннего скана loops=4. rows=20 показано на один цикл, итого 4 × 20 = 80, что совпадает с rows=80 у самого Nested Loop. Так же читается и время: actual time=...0.099 у внутреннего узла это время одного цикла, общее примерно в 4 раза больше. Nested Loop хорош именно здесь: внешних строк мало, а внутренняя сторона ищется по индексу.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Что значит Batches: 2 у узла Hash
Следующий вопрос
Сколько строк вернул параллельный скан