Isso é complementar à resposta de Erwin acima, mas o PostgreSQL suporta vários tipos de índices. Geralmente, estes não são mutuamente exclusivos. Você pode pensar neles como sendo:
- Método de índice (btree, GiST, GIN, etc). Escolha um, se necessário (btree é o padrão)
- Parcial ou completo. Se parcial, use uma cláusula where
- Direto ou funcional. Você pode indexar a saída de funções.
- Exclusivo ou não exclusivo
Tudo isso pode ser combinado de várias maneiras. Tudo o que você está fazendo aqui é usar os recursos exclusivos e parciais, o que fornece índices únicos parciais (que são extremamente úteis para você descobrir).
Mas suponha que você queira ter um índice que não diferencia maiúsculas de minúsculas no campo do subconjunto em que tipo é verdadeiro. Então você adicionaria uma definição funcional:
CREATE INDEX my_index_name_idx_u ON tbl (lower(subset)) WHERE type;
Observe que isso cria um índice exclusivo na saída da função lower () chamada no atributo de subconjunto em que type é true.