Ik heb nog nooit met hstore gespeeld, maar ik doe iets soortgelijks als ik een EAV-kolom nodig heb, bijvoorbeeld:
create index on product_eav (eav_value) where (eav_type = 'int');
De beperking daarbij is dat u expliciet moet zijn in uw zoekopdracht om er gebruik van te maken, d.w.z. deze zoekopdracht zou geen gebruik maken van de bovenstaande index:
select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size;
Maar deze zou:
select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size
and type = 'int';
In jouw voorbeeld zou het waarschijnlijk meer moeten zijn als:
create index on product ((data->'size')::int) where (data->'size' is not null);
Dit moet voorkomen dat een verwijzing naar de index wordt toegevoegd als er geen invoer voor de grootte is. Afhankelijk van de PG-versie die u gebruikt, moet de zoekopdracht mogelijk als volgt worden gewijzigd:
select product_id
from products
where data->'size' is not null
and data->'size' = :size;
Een ander groot verschil tussen reguliere en gedeeltelijke index is dat de laatste geen unieke beperking in een tabeldefinitie kan afdwingen. Dit gaat lukken:
create unique index foo_bar_key on foo (bar) where (cond);
Het volgende niet:
alter table foo add constraint foo_bar_key unique (bar) where (cond);
Maar dit zal:
alter table foo add constraint foo_bar_excl exclude (bar with =) where (cond);