В настоящее время мы выполняем запрос, который выполняет довольно простое объединение и группирование для подсчета строк и в конце объединения всех.
(select
table_p."name",
table_p.id,
count(table.id),
sum(table.views)
from table
inner join table_p on table_p.id = table.pageid
where table.date BETWEEN '2020-03-01' AND '2020-03-31'
group by table_p.id
order by table_p.id)
union all
(select
table_p."name",
table_p.id,
count(table.id),
sum(table.views)
from table
inner join table_p on table_p.id = table.pageid
where table.date BETWEEN '2020-02-01' AND '2020-02-29'
group by table_p.id
order by table_p.id)
union all ....
Мы решили использовать индекс BRIN из-за на счет нашей таблицы 360 миллионов записей. У нас есть возможность go с B-Tree, если это необходимо.
Теперь по какой-то причине мы видим в анализе объяснения, что для индекса BRIN для «параллельной осведомленности» установлено значение false с двумя работниками быть в списке в плане выхода? Кроме того, мы наблюдаем линейную производительность при разбивке запрашиваемой суммы, то есть один месяц за 5 секунд, четыре месяца за 20 секунд. Я бы предположил, что это означает, что мы выполняем запросы асинхронно, а не параллельно.
Есть ли у кого-нибудь какие-либо идеи относительно того, чего мы могли бы упустить, чтобы по возможности выполнять параллельные запросы? Разве BRIN не работает с параллельными рабочими?
Редактировать: Вот индекс BRIN для "таблицы":
CREATE INDEX table_brin_idx
ON table USING brin
(date, teamid, id, pageid, devicetypeid, makeid, modelid)
TABLESPACE pg_default;
Моя postgres версия PostgreSQL 11.6, скомпилирована Visual C ++ build 1800, 64-bit
Вот ссылка на анализ объяснения, который слишком велик для публикации здесь.