O Oracle possui índices globais, o Postgres não. Até agora tudo bem.
A Oracle então tem índices locais prefixados e não prefixados e a Oracle faz essa diferença, mesmo na V19: Oracle Docs
Eu realmente não entendo por que a Oracle faz essa diferença e só posso explicar isso com 'programação preguiçosa' para mim mesmo, mas essa não é a questão aqui.
Minha pergunta é: é útil no postgres prefixar um índice por outros motivos além destes óbvios:
- Ter a chave de particionamento como prefixo no índice é útil para você, assim como a classificação no índice é útil para você
- Ter a chave de particionamento como prefixo no índice é útil para você, pois a chave de particionamento pode ter muitos valores diferentes
Lendo a nomenclatura da Oracle, um índice prefixado parece ser um índice que possui a chave de particionamento como coluna ou colunas iniciais.
Não acho que haja algo de especial em um índice prefixado. Se você precisar dele para desempenho, crie-o. Se não, não faça isso.
Aqui está um exemplo: imagine uma tabela grande, com intervalo particionado por ano em um carimbo de data/hora, para que os dados antigos possam ser descartados facilmente. Se você precisar pesquisar dados por esse carimbo de data e hora rapidamente, poderá precisar de um índice na coluna para evitar uma verificação sequencial de uma partição inteira. Voila, um índice prefixado; nada de especial nisso.
A distinção mais importante é se um índice contém ou não a chave de particionamento, independentemente de a chave de particionamento estar ou não na coluna inicial. Com um índice local (o PostgreSQL possui apenas esses), você não pode impor exclusividade entre partições, portanto, você só pode criar um índice local exclusivo em uma tabela particionada se for exclusivo por definição, ou seja, contiver a chave de particionamento.
A documentação da Oracle que você cita diz que "Com um índice prefixado, a probabilidade de obter remoção de partição é muito maior do que com um índice não prefixado". Mas isso é bobagem. Você obtém a remoção da partição se tiver a chave de particionamento em sua
WHERE
condição e um índice não puder influenciar aWHERE
condição que uma consulta pode usar.Resumindo, também não sei por que a Oracle faz essa distinção. A documentação da Oracle diz que com um índice prefixado a Oracle pode usar o índice para remoção de partições, mas não vejo por que isso deveria fazer uma grande diferença.