Пропуски Middle EXPLAIN и оптимизация обновлено

Последние заказы: какой узел в плане

Вопрос

Запрос SELECT * FROM orders ORDER BY created_at DESC LIMIT 10, есть обычный индекс по created_at (по возрастанию). Таблица orders на 1 млн строк, customers на 50 тыс., PostgreSQL 16. Заполни пропуск в настоящем плане: каким узлом PostgreSQL читает индекс в обратном порядке?

Limit  (cost=0.42..0.76 rows=10 width=32) (actual time=0.136..0.138 rows=10 loops=1)
  ->  __(1)__ using orders_created_at_idx on orders  (cost=0.42..33391.43 rows=1000000 width=32) (actual time=0.135..0.136 rows=10 loops=1)
Planning Time: 0.711 ms
Execution Time: 0.167 ms

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

Заполните пропуски по номерам.

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

Коротко

B-tree можно читать в обе стороны, поэтому индекс по возрастанию годится и для ORDER BY createdat DESC: узел называется Index Scan Backward. Сортировки в плане нет, а Limit останавливает скан после 10 строк: при общей стоимости узла 33 391 сам запрос стоит 0,76.

Что в пропусках

1

Index Scan Backward

Разбор

B-tree можно читать в обе стороны, поэтому индекс по возрастанию годится и для ORDER BY created_at DESC: узел называется Index Scan Backward. Сортировки в плане нет, а Limit останавливает скан после 10 строк: при общей стоимости узла 33 391 сам запрос стоит 0,76. Отдельный индекс DESC нужен только для составных сортировок в разных направлениях, например ORDER BY a ASC, b DESC.

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

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

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