Jag har aldrig spelat med hstore, men jag gör något liknande när jag behöver en EAV-kolumn, t.ex.:
create index on product_eav (eav_value) where (eav_type = 'int');
Begränsningen för att göra det är att du måste vara tydlig i din fråga för att kunna använda den, dvs. den här frågan skulle inte använda ovanstående index:
select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size;
Men den här skulle:
select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size
and type = 'int';
I ditt exempel borde det troligen vara mer som:
create index on product ((data->'size')::int) where (data->'size' is not null);
Detta bör undvika att lägga till en referens till indexet när det inte finns någon storleksinmatning. Beroende på vilken PG-version du använder kan frågan behöva ändras så här:
select product_id
from products
where data->'size' is not null
and data->'size' = :size;
En annan stor skillnad mellan vanligt och partiellt index är att det senare inte kan tvinga fram en unik begränsning i en tabelldefinition. Detta kommer att lyckas:
create unique index foo_bar_key on foo (bar) where (cond);
Följande kommer inte:
alter table foo add constraint foo_bar_key unique (bar) where (cond);
Men det här kommer:
alter table foo add constraint foo_bar_excl exclude (bar with =) where (cond);