Никога не съм играл с hstore, но правя нещо подобно, когато имам нужда от EAV колона, напр.:
create index on product_eav (eav_value) where (eav_type = 'int');
Ограничението при това е, че трябва да сте изрични в заявката си, за да я използвате, т.е. тази заявка няма да използва горния индекс:
select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size;
Но този би:
select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size
and type = 'int';
Във вашия пример вероятно трябва да изглежда по-скоро:
create index on product ((data->'size')::int) where (data->'size' is not null);
Това трябва да избягва добавянето на препратка към индекса, когато няма запис за размер. В зависимост от версията на PG, която използвате, може да се наложи заявката да бъде модифицирана по следния начин:
select product_id
from products
where data->'size' is not null
and data->'size' = :size;
Друга голяма разлика между обикновения и частичния индекс е, че последният не може да наложи уникално ограничение в дефиниция на таблица. Това ще успее:
create unique index foo_bar_key on foo (bar) where (cond);
Следното няма да:
alter table foo add constraint foo_bar_key unique (bar) where (cond);
Но това ще:
alter table foo add constraint foo_bar_excl exclude (bar with =) where (cond);