Отсортированы ли данные Postgres cache (shared_buffers) в соответствии с индексами?

#postgresql #caching #indexing

#postgresql #кэширование #индексирование

Вопрос:

Я не очень хорошо разбираюсь в Postgres, так что потерпите меня.

Поскольку индексирование таблицы физически не упорядочивает ее на диске в соответствии с индексом, мой вопрос заключается в том, упорядочено ли содержимое shared_buffers в соответствии с ним?

Комментарии:

1. Я бы этого не ожидал. Буферный кэш просто кэширует блоки с жесткого диска — он понятия не имеет, к какому индексу или таблице он принадлежит, насколько я знаю. Они могут оказаться рядом друг с другом, но это также не продлится долго, если блоки будут удалены из кэша

2. это означает, что только определенный индекс (тот, который выбран оптимизатором запросов) знает порядок строк (это представление в памяти, но не обязательно на диске)?

3. @a_horse_with_no_name спасибо, я думаю, что для обзора с высоты птичьего полета этого достаточно

Ответ №1:

Когда PostgreSQL необходимо прочитать блок размером 8 КБ, он находит первый доступный чистый буфер с показателем использования 0 и загружает в него блок. Таким образом, блоки (индекс или таблица) находятся в общих буферах случайным образом.

Это не должно иметь значения, поскольку в наши дни к памяти осуществляется произвольный доступ.

Согласно вашему комментарию, вы действительно хотите знать, на что влияет команда CLUSTER :

CLUSTER переписывает таблицу таким образом, чтобы строки были физически упорядочены на диске в логическом порядке индекса. В пределах одного блока этот порядок будет сохранен, когда данные находятся в общих буферах (поскольку блок копируется в память как есть). Но разные блоки таблицы не будут помещаться в общие буферы близко друг к другу или в каком-либо определенном порядке.

Идея состоит в том, чтобы убедиться, что при индексном сканировании, которое обращается к нескольким строкам, необходимо считывать с диска как можно меньше блоков таблицы, причем в последовательном порядке. В памяти не имеет значения, считываются блоки последовательно или нет.

Комментарии:

1. Мне было интересно, в каком из этих мест (файлы табличного диска, shared_buffers, индексные файлы) данные упорядочены в соответствии с кластеризованным ключом

2. Я расширил ответ, чтобы охватить CLUSTER .