Последние заказы: какой узел в плане
Вопрос
Запрос 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
Попробуйте сами
Заполните пропуски по номерам.
Показать ответ и разбор
Коротко
Что в пропусках
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 ошибок.
Предыдущий вопрос
EXPLAIN ANALYZE и расширенная статистика
Следующий вопрос
Чтение плана: полный просмотр и фильтр