#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
.