मैंने कभी 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;
नियमित और आंशिक सूचकांक के बीच एक और बड़ा अंतर यह है कि बाद वाला एक तालिका परिभाषा में एक अद्वितीय बाधा को लागू नहीं कर सकता है। यह सफल होगा:
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);