Certamente é. Discutimos isso em detalhes na questão relacionada:
O espaço é alocado em múltiplos de MAXALIGN
, normalmente 8 bytes em um sistema operacional de 64 bits ou (muito menos comum) 4 bytes em um sistema operacional de 32 bits. Se você não tiver certeza, verifique pg_controldata
. Também depende dos tipos de dados das colunas indexadas (algumas requerem preenchimento de alinhamento) e do conteúdo real.
Um índice em, digamos, duas integer
colunas (4 bytes cada) normalmente acaba exatamente do tamanho de um índice em apenas uma, onde outros 4 bytes são perdidos no preenchimento do alinhamento.
Nesse caso, não há realmente nenhuma desvantagem para o planejador de consultas usar um índice (a,b)
- comparado a um índice apenas (a)
. E geralmente é preferível que várias consultas usem o mesmo índice. A chance de ele (ou parte dele) residir no cache (rápido) aumenta quando compartilhada.
Se você já mantém um índice ativado (a,b)
, não faz sentido criar outro índice apenas (a)
- a menos que seja substancialmente menor. O mesmo não vale para (b,a)
vs. (a)
. Siga o link na primeira linha para saber mais sobre isso.
Vindo da direção oposta, quando você precisar de um índice adicional como esse (a,b)
, considere soltar um índice existente apenas (a)
- se possível. Geralmente não é possível, pois esse é o índice de uma PK ou UNIQUE
restrição. Desde o Postgres 11, você pode simplesmente anexar b
à definição de restrição com a INCLUDE
cláusula. Detalhes no manual.
Ou crie o novo índice (b,a)
para cobrir consultas apenas b
adicionalmente. Somente para condições de igualdade, a ordem das expressões de índice nos índices btree não importa. Porém, quando envolve condições de alcance. Vejo:
Existem possíveis desvantagens em incluir colunas adicionais em um índice, mesmo que isso use apenas o espaço perdido para o preenchimento do alinhamento:
- Sempre que a coluna adicional é atualizada, o índice agora também precisa de uma atualização, o que pode aumentar o custo das operações de gravação e criar mais inchaço no índice.
- As atualizações HOT (Heap Only Tuple) na tabela não são possíveis enquanto estiver envolvida qualquer coluna de índice.
Mais sobre atualizações HOT:
Como medir tamanhos de objeto: