Сколько страниц нужно прочитать, чтобы выполнить простой поиск по индексу в Postgres? - PullRequest
0 голосов
/ 18 октября 2019

Меня интересует понимание того, как Postgres читает страницы с диска / кэша при использовании индекса.

Рассмотрим запрос к индексированной таблице из одного столбца целых чисел:

select i 
into numbers
from generate_series(1, 200000) s(i);

create index idx on numbers(i);

explain (buffers, analyse)
select * from numbers where i = 456789; -- random row

Этот единственный индекс-только поиск требует 3 чтения страницы в этой таблице строк 200k (Buffers: shared hit=3):

Index Only Scan using idx on numbers  (cost=0.42..8.44 rows=1 width=4) (actual time=0.010..0.010 rows=0 loops=1)
  Index Cond: (i = 456789)
  Heap Fetches: 0
  Buffers: shared hit=3
Planning Time: 0.043 ms
Execution Time: 0.022 ms

Ожидается ли это? К чему относятся 3 страницы? Это просто число страниц индекса, которые нужно было прочитать, чтобы пройти через B-дерево?

Справочная информация : я пытаюсь настроить рекурсивный CTE, который просматривает связанный списокструктура хранится в одной таблице как родительско-дочерние отношения / дерево смежности. Рекурсивный раздел запроса - это очень простой поиск по индексу, аналогичный приведенному выше. Каждый «цикл» рекурсивного CTE приводит к 3 чтениям страницы (как указано выше), в которых и лежит большая часть стоимости запроса. Может быть невозможно сделать это более эффективным, но мне было интересно, можно ли это как-то улучшить (в настоящее время ~ 30000 считываний страниц для цепочки узлов 10 Кб, ~ 25 мс кэшировано).

1 Ответ

1 голос
/ 18 октября 2019

Вам повезло, что автовакуум завершился до того, как вы запустили свой запрос, иначе это было бы 4 блоками.

Ваш запрос получил доступ к корневому узлу, промежуточному звену. узел и листовой узел индекса. Не было необходимости обращаться к блоку таблицы (Heap Fetches: 0), потому что

  1. вся информация доступна в индексе

  2. таблицыКарта видимости показала, что блок таблицы был полностью видимым, поэтому не было необходимости обращаться к блоку таблицы за информацией о видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...