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;
通常のインデックスと部分インデックスのもう1つの大きな違いは、後者はテーブル定義に一意の制約を適用できないことです。これは成功します:
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);