2012-09-22 17 views
22

मेरे पास एक बूलियन फ़ील्ड वाला रेल मॉडल है जिसे मैं खोजता हूं (मैं एक ऐसे क्षेत्र का उपयोग करता हूं जो सभी उदाहरणों को पाता है जहां फ़ील्ड सत्य पर सेट है)। मैं पोस्टग्रेस का उपयोग कर रहा हूँ।एक बूलियन फ़ील्ड पर एक इंडेक्स जोड़ना

मेरा वृत्ति बूलियन क्षेत्र पर एक सूचकांक जोड़ना है। क्या यह अच्छा अभ्यास है, या पोस्टग्रेज़ में कुछ ऐसा है जो एक बूलियन क्षेत्र पर एक सूचकांक अनावश्यक बनाता है?

उत्तर

34

नहीं, यदि आप इसके द्वारा फ़िल्टरिंग करेंगे तो आप एक बूलियन फ़ील्ड को इंडेक्स कर सकते हैं। यह करने के लिए एक पूरी तरह से उचित बात है, हालांकि सभी इंडेक्स के साथ, PostgreSQL इसे अनदेखा करना चुन सकता है अगर यह पर्याप्त तालिका को बाहर नहीं रखेगा - एक इंडेक्स स्कैन प्लस पंक्तियों का एक टन अनुक्रमिक स्कैन की तुलना में अधिक महंगा हो सकता है - - जो उस कॉलम के मानों के आधार पर आपको प्रभावित कर सकता है या नहीं।

आपको यह भी पता होना चाहिए कि PostgreSQL आपको इंडेक्स पर स्थितियों को रखने देता है, जिसे मैं अक्सर बूलियन फ़ील्ड के साथ उपयोगी पाता हूं। (विवरण के लिए Partial Indexes देखें।) यदि आप उस दायरे में आमतौर पर फ़िल्टरिंग या सॉर्टिंग करेंगे, तो आपको CREATE INDEX ... ON table (some_field) WHERE boolean_field जैसी कुछ चीज़ों द्वारा सर्वश्रेष्ठ सेवा दी जा सकती है।

+21

बस इसमें जोड़ने के लिए, यदि आपके बूलियन फ़ील्ड में 99.9% एक मान है, तो यह केवल अन्य संभावित मूल्यों को इंडेक्स करने में बहुत मददगार हो सकता है। अर्थात। 99.9% झूठा, 0% नल, 0.1% सत्य, फिर सूचकांक बनाएं .. तालिका (बूलवाल) पर जहां बूलवल सत्य है; केवल वास्तविक मूल्यों को अनुक्रमित करेगा। आंशिक अनुक्रमणिका का उल्लेख करने के लिए –

+6

+1। –

13

रेल माइग्रेशन में आंशिक अनुक्रमणिका बनाने के लिए, आप यह करेंगे। इस उदाहरण में, मॉडल Product है और कॉलम featured है।

class AddFeaturedOnProducts < ActiveRecord::Migration 
    def change 
    add_index(:products, :featured, where: "featured") 
    end 
end 
संबंधित मुद्दे