Jeg har aldrig spillet med hstore, men jeg gør noget lignende, når jeg har brug for en EAV-søjle, f.eks.:
create index on product_eav (eav_value) where (eav_type = 'int');
Begrænsningen ved at gøre det er, at du skal være eksplicit i din forespørgsel for at gøre brug af den, dvs. denne forespørgsel ville ikke gøre brug af ovenstående indeks:
select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size;
Men denne ville:
select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size
and type = 'int';
I dit eksempel burde det sandsynligvis være mere som:
create index on product ((data->'size')::int) where (data->'size' is not null);
Dette bør undgå at tilføje en reference til indekset, når der ikke er nogen størrelsesindtastning. Afhængigt af den PG-version, du bruger, skal forespørgslen muligvis ændres sådan:
select product_id
from products
where data->'size' is not null
and data->'size' = :size;
En anden stor forskel mellem regulært og delvist indeks er, at sidstnævnte ikke kan håndhæve en unik begrænsning i en tabeldefinition. Dette vil lykkes:
create unique index foo_bar_key on foo (bar) where (cond);
Følgende vil ikke:
alter table foo add constraint foo_bar_key unique (bar) where (cond);
Men dette vil:
alter table foo add constraint foo_bar_excl exclude (bar with =) where (cond);