Может ли Postgres использовать несколько индексов в одном запросе? - PullRequest
0 голосов
/ 06 октября 2019

Предположим, у меня есть запрос, подобный приведенному ниже:

select 
   sum(impressions) as imp, sum(taps) as taps 
   from report 
   where org_id = 1 and report_date between '2019-01-01' and '2019-10-10'
   group by country, text;

В MYSQL нет поддержки множественной индексации для одиночного запроса . Могу ли я использовать несколько индексов для одного запроса в PostgeSQL?

Как:

For where condition: index(org_id, report_date);
For group by: index(country, text);

Объяснить:

"GroupAggregate  (cost=8.18..8.21 rows=1 width=604)"
"  Group Key: country, text"
"  ->  Sort  (cost=8.18..8.18 rows=1 width=556)"
"        Sort Key: country, text"
"        ->  Index Scan using idx_org_date on report  (cost=0.14..8.17 rows=1 width=556)"
"              Index Cond: ((org_id = 1) AND (date >= '2019-01-01'::date) AND (date <= '2019-02-02'::date))"

1 Ответ

1 голос
/ 06 октября 2019

Да и нет. В общем, это возможно, но он не может использовать один индекс для получения избирательности, а другой - для получения порядка, необходимого для эффективного GROUP BY, для того же отношения.

Например, если у вас были отдельные индексы на«org_id» и «report_date», он сможет объединить их с помощью BitmapAnd. Но это было бы менее эффективно, чем использование текущего индекса из двух столбцов, поэтому этот факт, вероятно, вам не нужен.

Возможно, вам лучше использовать HashAgg. Вы можете попробовать увеличить work_mem, чтобы получить его. Но если в действительности есть только одна строка, это не будет иметь большого значения.

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