Ich habe noch nie mit hstore gespielt, aber ich mache etwas Ähnliches, wenn ich eine EAV-Spalte brauche, z. B.:
create index on product_eav (eav_value) where (eav_type = 'int');
Die Einschränkung dabei ist, dass Sie in Ihrer Abfrage explizit sein müssen, um sie zu verwenden, d. h. diese Abfrage würde den obigen Index nicht verwenden:
select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size;
Aber dieses würde:
select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size
and type = 'int';
In Ihrem Beispiel sollte es wahrscheinlich eher so aussehen:
create index on product ((data->'size')::int) where (data->'size' is not null);
Dadurch sollte vermieden werden, dass ein Verweis auf den Index hinzugefügt wird, wenn kein Größeneintrag vorhanden ist. Abhängig von der PG-Version, die Sie verwenden, muss die Abfrage möglicherweise wie folgt geändert werden:
select product_id
from products
where data->'size' is not null
and data->'size' = :size;
Ein weiterer großer Unterschied zwischen regulären und partiellen Indizes besteht darin, dass letztere keine eindeutige Einschränkung in einer Tabellendefinition erzwingen können. Das wird gelingen:
create unique index foo_bar_key on foo (bar) where (cond);
Folgendes nicht:
alter table foo add constraint foo_bar_key unique (bar) where (cond);
Aber das wird:
alter table foo add constraint foo_bar_excl exclude (bar with =) where (cond);