Почему postgres "scan index (btree)" фаза плана возвращает все строки? - PullRequest
0 голосов
/ 30 мая 2019

У меня возникли некоторые недоразумения с btree с использованием Postgres 9.6.

Я использую SELECT max(total_amount) FROM bookings;

Общее количество строк 2111110, total_amount - числовое (10,2)

У меня есть индекс для этого столбца

CREATE INDEX ON bookings USING btree (total_amount);

Когда я использую объяснение, я вижу:

enter image description here

И как язнаю, что Btree - упорядоченное дерево, поэтому чтобы найти минимальное значение ключа, вы должны перейти влево от корня к концу, максимум - вправо

Так почему postgres получает все строки, но не одну, из узла индекса сканирования?

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Нет, он не получает все строки - если вы посмотрите внимательно, то есть шаг Limit прямо над индексом только сканирование назад - и это оценивает только 1 строку.Таким образом, сканирование индекса останавливается после первой строки, извлеченной из индекса.

0 голосов
/ 30 мая 2019

То, что вы опубликовали, является планом выполнения, а цифры являются приблизительными, а не истинными. Особенность способа представления планов выполнения состоит в том, что предполагаемое количество строк для узла предполагает, что узел будет работать до завершения. Обратите внимание, что узел LIMIT над ним затем сокращает как оценку строки, так и оценку стоимости, чтобы учесть тот факт, что ожидается остановка на ранней стадии. Можно было бы отодвинуть эту отчетность обратно от узла LIMIT к нижнему узлу, но это просто не то соглашение об учете, которое использовалось.

Если вы выполните EXPLAIN (ANALYZE) плана, он также сообщит о фактических счетах, и вы увидите, что фактический счет равен 1. Немного сбивает с толку тот факт, что расчетные и фактические значения не сообщаются в та же основа здесь.

...