PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Limitações práticas de índices de expressão no PostgreSQL


Nunca joguei com hstore, mas faço algo parecido quando preciso de uma coluna EAV, por exemplo:
create index on product_eav (eav_value) where (eav_type = 'int');

A limitação em fazer isso é que você precisa ser explícito em sua consulta para fazer uso dela, ou seja, essa consulta não faria uso do índice acima:
select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size;

Mas este seria:
select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size
and type = 'int';

No seu exemplo, provavelmente deve ser mais como:
create index on product ((data->'size')::int) where (data->'size' is not null);

Isso deve evitar adicionar uma referência ao índice quando não houver entrada de tamanho. Dependendo da versão do PG que você está usando, a consulta pode precisar ser modificada da seguinte forma:
select product_id
from products
where data->'size' is not null
and data->'size' = :size;

Outra grande diferença entre índice regular e parcial é que o último não pode impor uma restrição exclusiva em uma definição de tabela. Isso vai dar certo:
create unique index foo_bar_key on foo (bar) where (cond);

O seguinte não:
alter table foo add constraint foo_bar_key unique (bar) where (cond);

Mas isso vai:
alter table foo add constraint foo_bar_excl exclude (bar with =) where (cond);