Saya belum pernah bermain dengan hstore, tetapi saya melakukan hal serupa ketika saya membutuhkan kolom EAV, mis.:
create index on product_eav (eav_value) where (eav_type = 'int');
Batasan dalam melakukannya adalah Anda harus eksplisit dalam kueri Anda untuk menggunakannya, yaitu kueri ini tidak akan menggunakan indeks di atas:
select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size;
Tapi yang ini akan:
select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size
and type = 'int';
Dalam contoh Anda kemungkinan besar akan lebih seperti:
create index on product ((data->'size')::int) where (data->'size' is not null);
Ini harus menghindari penambahan referensi ke indeks ketika tidak ada entri ukuran. Bergantung pada versi PG yang Anda gunakan, kueri mungkin perlu dimodifikasi seperti ini:
select product_id
from products
where data->'size' is not null
and data->'size' = :size;
Perbedaan besar lainnya antara indeks reguler dan parsial adalah bahwa yang terakhir tidak dapat menerapkan batasan unik dalam definisi tabel. Ini akan berhasil:
create unique index foo_bar_key on foo (bar) where (cond);
Berikut ini tidak akan:
alter table foo add constraint foo_bar_key unique (bar) where (cond);
Tapi ini akan:
alter table foo add constraint foo_bar_excl exclude (bar with =) where (cond);