Когда PostgreSQL анализирует ваши данные , одна из статистических данных, рассчитанных и используемых планировщиком запросов, - это корреляция между порядком значений в вашем полеили индекс, и порядок на диске.
Статистическая корреляция между физическим порядком строк и логическим порядком значений столбцов.Это колеблется от -1 до +1.Когда значение около -1 или +1, сканирование индекса по столбцу будет оцениваться дешевле, чем когда оно близко к нулю, из-за сокращения произвольного доступа к диску.(Этот столбец имеет значение NULL, если тип данных столбца не имеет оператора <). </p>
Функции оценки стоимости индекса также вычисляют корреляция :
Параметр indexCorrelation должен быть установлен на корреляцию (в диапазоне от -1,0 до 1,0) между порядком индекса и порядком таблицы.Это используется для корректировки оценки стоимости выборки строк из родительской таблицы.
Не знаю точно, но я предполагаю, что значения корреляции из различных возможных планов используютсяпланировщик при определении того, может ли число строк, считываемых из таблицы, быть выполнено с меньшими затратами путем выполнения сканирования таблицы, последовательного ввода-вывода (возможно, объединения с другим параллельным сканированием той же таблицы), фильтрации необходимых строк илисканирование индекса с последующим поиском.
PostgreSQL не сохраняет таблицы отсортированными по какому-либо определенному ключу, но их можно периодически воссоздавать в определенном порядке индекса с помощью команды CLUSTER (который будет медленным, с поиском диска на строку, если данные в кластере имеют низкую корреляцию с порядком значений индекса).
PostgreSQL может эффективно собирать набор дисковых блоков, которые необходимо извлечь, а затем получитьих в физическом порядке, чтобы уменьшить поиск.Это делается с помощью растрового сканирования. Примечания к выпуску для 8.1 говорят:
Битовые сканы полезны даже с одним индексом, поскольку они уменьшают количество необходимого произвольного доступа;Сканирование индекса растрового изображения эффективно для извлечения довольно больших фракций полной таблицы, тогда как сканирование обычного индекса - нет.
Редактировать: я хотел упомянуть значения затрат плановика seq_page_cost
и random_page_cost
, которые сообщают планировщику об относительных затратах на выполнение выборки страницы на диске, которая является частью серии последовательных выборок, по сравнению с непоследовательной выборкой страницы диска.