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);