Запрос Postgresql с очень большим набором результатов - PullRequest
1 голос
/ 16 июня 2010

В приложении мне нужно запросить базу данных Postgres, где я ожидаю десятки или даже сотни миллионов строк в наборе результатов. Я мог бы делать этот запрос один раз в день или даже чаще. Сам запрос относительно прост, хотя может включать несколько соединений.

Мой вопрос таков: насколько уместен Postgres в отношении того, чтобы избегать необходимости искать по диску для каждой строки набора результатов? Учитывая время, необходимое для поиска жесткого диска, это может быть очень дорого.

Если это не проблема, как Postgres избегает этого? Откуда он знает, как выложить данные на диск так, чтобы они могли эффективно передаваться в ответ на этот запрос?

1 Ответ

2 голосов
/ 16 июня 2010

Когда PostgreSQL анализирует ваши данные , одна из статистических данных, рассчитанных и используемых планировщиком запросов, - это корреляция между порядком значений в вашем полеили индекс, и порядок на диске.

Статистическая корреляция между физическим порядком строк и логическим порядком значений столбцов.Это колеблется от -1 до +1.Когда значение около -1 или +1, сканирование индекса по столбцу будет оцениваться дешевле, чем когда оно близко к нулю, из-за сокращения произвольного доступа к диску.(Этот столбец имеет значение NULL, если тип данных столбца не имеет оператора <). </p>

Функции оценки стоимости индекса также вычисляют корреляция :

Параметр indexCorrelation должен быть установлен на корреляцию (в диапазоне от -1,0 до 1,0) между порядком индекса и порядком таблицы.Это используется для корректировки оценки стоимости выборки строк из родительской таблицы.

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

PostgreSQL не сохраняет таблицы отсортированными по какому-либо определенному ключу, но их можно периодически воссоздавать в определенном порядке индекса с помощью команды CLUSTER (который будет медленным, с поиском диска на строку, если данные в кластере имеют низкую корреляцию с порядком значений индекса).

PostgreSQL может эффективно собирать набор дисковых блоков, которые необходимо извлечь, а затем получитьих в физическом порядке, чтобы уменьшить поиск.Это делается с помощью растрового сканирования. Примечания к выпуску для 8.1 говорят:

Битовые сканы полезны даже с одним индексом, поскольку они уменьшают количество необходимого произвольного доступа;Сканирование индекса растрового изображения эффективно для извлечения довольно больших фракций полной таблицы, тогда как сканирование обычного индекса - нет.


Редактировать: я хотел упомянуть значения затрат плановика seq_page_cost и random_page_cost, которые сообщают планировщику об относительных затратах на выполнение выборки страницы на диске, которая является частью серии последовательных выборок, по сравнению с непоследовательной выборкой страницы диска.

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