Это определенно. Мы обсудили это очень подробно под этим связанным вопросом:
Пространство выделяется в виде кратного числа MAXALIGN
, которое обычно составляет 8 байт в 64-разрядной ОС или (гораздо реже) 4 байта в 32-разрядной ОС. Если вы не уверены, проверьте pg_controldata
. Это также зависит от типов данных индексированных столбцов (некоторые требуют заполнения выравнивания) и фактического содержимого.
Индекс, скажем, для двух integer
столбцов (по 4 байта в каждом) обычно заканчивается точно таким же большим, как индекс только для одного, где еще 4 байта теряются при заполнении выравнивания.
В таком случае у планировщика запросов действительно нет недостатка в использовании индекса (a,b)
- по сравнению с индексом только (a)
. И, как правило, для нескольких запросов предпочтительно использовать один и тот же индекс. Вероятность того, что он (или его части) окажется в (быстром) кэше, при совместном использовании возрастает.
Если вы уже поддерживаете индекс (a,b)
, тогда не имеет смысла создавать другой индекс просто (a)
- если только он существенно не меньше. То же самое не относится к (b,a)
против (a)
. Перейдите по ссылке в первой строке, чтобы узнать больше.
Если исходить из противоположного направления, когда вам нужен дополнительный индекс, подобный этому (a,b)
, подумайте о том, чтобы сбросить существующий индекс просто (a)
- если это возможно. Часто это невозможно, поскольку это индекс PK или UNIQUE
ограничения. Начиная с Postgres 11 вы можете просто добавить b
к определению ограничения INCLUDE
вместо этого предложение. Подробности в руководстве.
Или создайте новый индекс (b,a)
вместо этого, чтобы покрыть запросы только b
дополнительно. Только для условий равенства порядок индексных выражений в индексах btree не имеет значения. Тем не менее, при использовании условий дальности. Видеть:
Есть потенциальные недостатки включения дополнительных столбцов в индекс, даже если он использует только пробел, в противном случае теряется при заполнении выравнивания:
- Всякий раз, когда обновляется дополнительный столбец, индекс также нуждается в обновлении, что может увеличить стоимость операций записи и создать больше размазывания индекса.
- ГОРЯЧИЕ обновления (Heap Only Tuple) для таблицы невозможны, пока задействован какой-либо столбец индекса.
Подробнее о горячих обновлениях:
Как измерить размеры объекта: