PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Limitazioni pratiche degli indici di espressione in PostgreSQL

Non ho mai giocato con hstore, ma faccio qualcosa di simile quando ho bisogno di una colonna EAV, ad es.:

create index on product_eav (eav_value) where (eav_type = 'int');

La limitazione nel farlo è che devi essere esplicito nella tua query per farne uso, ad es. questa query non utilizzerà l'indice sopra:

select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size;

Ma questo sarebbe:

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

Nel tuo esempio dovrebbe essere più simile a:

create index on product ((data->'size')::int) where (data->'size' is not null);

Ciò dovrebbe evitare di aggiungere un riferimento all'indice quando non è presente alcuna voce di dimensione. A seconda della versione del PG in uso, potrebbe essere necessario modificare la query in questo modo:

select product_id
from products
where data->'size' is not null
and data->'size' = :size;

Un'altra grande differenza tra indice regolare e parziale è che quest'ultimo non può imporre un vincolo univoco nella definizione di una tabella. Questo avrà successo:

create unique index foo_bar_key on foo (bar) where (cond);

I seguenti non lo faranno:

alter table foo add constraint foo_bar_key unique (bar) where (cond);

Ma questo:

alter table foo add constraint foo_bar_excl exclude (bar with =) where (cond);