Я никогда не играл с 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);