Лучшая практика для больших таблиц postgres - PullRequest
1 голос
/ 03 октября 2019

У меня есть таблица с 3 полями (имя пользователя, target_value, оценка), сгенерированная извне путем полного пересечения имени пользователя (~ 400 000) и target_value (~ 4000) и вычисленной оценки, что приводит к общему количеству строк ~ 1,6 млрд. .

Все мои запросы в этой таблице будут в формате

SELECT *
FROM _table
WHERE target_values IN (123, 456)

Моя первоначальная версия включала индекс BTREE для target_values, но я потратил 45 минут на BITMAP HEAPСканирование индекса. Я также смотрел на индексы BRIN, разделы и кластеризацию таблиц, но поскольку для применения каждого подхода к таблице требуются часы, я не могу точно перебрать каждый параметр и проверить производительность.

Каковы некоторые рекомендации по работес одной массивной таблицей с очень «блочными» данными в Postgres 10?

1 Ответ

3 голосов
/ 03 октября 2019

Если таблица представляет собой перекрестное объединение двух наборов данных, почему бы вам не сохранить отдельные таблицы и не рассчитать объединение по мере необходимости? Базы данных хороши в этом.

Из вашего описания я бы ожидал увеличения производительности, если бы вы запустили CLUSTER в таблице, чтобы физически переписать ее в порядке индекса. Тогда вам нужно будет получить доступ к меньшему количеству блоков таблиц.

К сожалению CLUSTER займет много времени, сделает таблицу недоступной и должна регулярно повторяться.

Альтернативой, которая может быть лучше, являетсяразбить таблицу на target_value. 4000 разделов - это немного, поэтому, возможно, используйте разделение по спискам для объединения нескольких в один раздел.

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

Суть в том, что если вы выберете много строк в таблице, это всегда займет много времени.

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