Я провел несколько экспериментов, и утверждение в заголовке кажется верным, я хотел бы знать, есть ли способ обойти это.
Вот пример:
CREATE TABLE test ( cond text, v1 integer, v2 integer, v3 integer );
-- Insert millions of rows
CREATE INDEX cond_idx ON test (cond);
CREATE INDEX values_idx ON test (v1, v2, v3);
VACUUM ANALYZE test;
Выполнение этих запросов:
-- Uses Index Only Scan on values_idx for projection
SELECT sum(v1), sum(v2), sum(v3) FROM test;
-- Uses Bitmap Index Scan on cond_idx then a Bitmap Heap Scan
-- This is undesirable as it doesn't rely exclusively on indexes
SELECT sum(v1), sum(v2), sum(v3) FROM test WHERE cond = '123';
PostgreSQL может эффективно комбинировать индексы, но, похоже, только для составных условий. Есть ли способ заставить PostgreSQL использовать индекс для проекции после того, как он использовал одну или несколько для поиска необходимых строк?
Автоматическим ответом будет создание единого индекса со всеми 4 столбцами. Дело в том, что это всего лишь минималистичный пример. В реальном сценарии одна и та же таблица будет запрашиваться разными столбцами, требующими многостолбцовых индексов для каждого необходимого условия запроса.
ОБНОВЛЕНИЕ: счетчик изменен на сумму, чтобы сделать пример более понятным. Также добавлено больше столбцов «значение».