У меня есть большой объем данных (500+ мил строк) в таблице, которые мне нужно отфильтровать / запросить в режиме реального времени. Я не смог получить удовлетворительную производительность или предсказуемые планы запросов, используя обычные индексы b-дерева. Я думал, что использование BRIN очень помогло бы, но поскольку наши данные не могут быть вставлены в какой-либо контролируемый физический порядок, по которому мне нужно запросить, я настроил MATERIALIZED VIEW
, чтобы выбрать данные (включая объединенные данные) и отсортировать их в указанном порядке c. Что-то вроде ...
CREATE MATERIALIZED VIEW my_view AS
SELECT a.one, b.two, b.three, c.four, c.five, c.six
FROM a, b, c WHERE ...joins
ORDER BY b.three, b.two, a.one, c.four;
Затем я создал индекс на основе нескольких столбцов, поскольку все указанные столбцы будут всегда использоваться в одном запрос, для которого предназначено это представление.
CREATE INDEX my_view_idx ON my_view
USING BRIN (three, two, one, four) WITH (pages_per_range = 64);
Я упорядочил столбцы (как в таблице , так и в BRIN) на основе селективности, то есть b.three
отфильтрует 80% записи (ie. будет соответствовать только 20% записей), b.two
отфильтрует 70% и т. д. c.
Упорядочивал столбцы BRIN так же, как физическая сортировка таблицы? Я не могу найти ресурсы, которые описывают это. ближайшая вещь, которую я мог найти, была из: https://www.postgresql.org/docs/10/indexes-multicolumn.html ...
Многоколонный индекс BRIN может использоваться с условиями запроса, которые включают любое подмножество столбцов индекса. Подобно GIN и в отличие от B-дерева или GiST, эффективность поиска по индексу одинакова независимо от того, какие столбцы индекса используются условиями запроса.
... но это не описывает столбец заказ , только включение в запрос .
Я мог бы поэкспериментировать (и был, с удивительно хорошими результатами), но это медленный процесс, так как на это требуется более 2 часов материализовать представление и построить индекс, поэтому мне бы хотелось иметь какую-то фактическую основу для моих предположений, чтобы не тратить много времени.