मैं PostgreSQL (9.4) डेटाबेस के साथ रूबी ऑन रेल्स में एक एप्लिकेशन विकसित कर रहा हूं। मेरे उपयोग के मामले में, तालिकाओं में स्तंभों को बहुत बार देखा जाएगा, क्योंकि आवेदन का पूरा बिंदु एक मॉडल पर बहुत विशिष्ट विशेषताओं की खोज कर रहा है।
मैं वर्तमान में यह तय कर रहा हूं कि स्तंभों के लिए एक integer
प्रकार का उपयोग करें या बस एक विशिष्ट स्ट्रिंग प्रकार (जैसे character varying(255)
, जो रेल में डिफ़ॉल्ट है ) का उपयोग करें, क्योंकि मुझे यकीन नहीं है कि प्रदर्शन अंतर सूचकांक पर क्या होगा।
ये कॉलम एनम हैं । उनके पास संभावित मूल्यों की मात्रा के लिए एक निश्चित आकार है जो उनके पास हो सकते हैं। अधिकांश एनुम की लंबाई 5 से अधिक नहीं होती है, जिसका अर्थ है कि आवेदन के पूरे जीवन काल में सूचकांक कम या ज्यादा निश्चित होगा ; इस प्रकार, पूर्णांक और स्ट्रिंग सूचकांक नोड्स की संख्या में समान होंगे।
हालाँकि, जो स्ट्रिंग अनुक्रमित किया जाएगा, वह लगभग 20 वर्ण लंबा हो सकता है, जो कि मेमोरी में लगभग 5x होता है जो पूर्णांक का होता है (यदि पूर्णांक 4 बाइट्स है, और तार 1 बाइट प्रति वर्ण पर शुद्ध ASCII हैं, तो यह है)। मुझे नहीं पता है कि डेटाबेस इंजन इंडेक्स लुक-अप कैसे करते हैं, लेकिन अगर यह स्ट्रिंग को "स्कैन" करने की आवश्यकता है जब तक कि यह बिल्कुल मेल नहीं खाता है , तो संक्षेप में इसका मतलब है कि स्ट्रिंग लुकअप पूर्णांक लुकअप की तुलना में 5x धीमा होगा; "स्कैन" जब तक पूर्णांक लुकअप के लिए मिलान 20 के बजाय 4 बाइट होगा। यह वही है जो मैं कल्पना कर रहा हूं:
लुकअप मान है (पूर्णांक) 4:
स्कैनिंग ............................ FOUND | रिकॉर्ड प्राप्त कर रहा है ... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | BYTE_8 | BYTE_8 | ...
लुकअप मान (स्ट्रिंग) "some_val" (8 बाइट्स) है:
स्कैनिंग ................................................. ……………………………… FOUND | रिकॉर्ड प्राप्त कर रहा है ... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | BYTE_8 | BYTE_8 | ...
मुझे उम्मीद है कि यह समझ में आता है। मूल रूप से, क्योंकि पूर्णांक कम जगह लेता है, यह उसके स्ट्रिंग समकक्ष की तुलना में "तेजी से मिलान" किया जा सकता है। शायद यह पूरी तरह से गलत अनुमान है, लेकिन मैं कोई विशेषज्ञ नहीं हूं, इसलिए मैं आप लोगों से पूछ रहा हूं! मुझे लगता है कि यह जवाब जो मुझे मिला है वह मेरी परिकल्पना का समर्थन करता है, लेकिन मैं निश्चित होना चाहता हूं।
कॉलम में संभावित मानों में से किसी एक का उपयोग करने में परिवर्तन नहीं होगा, इसलिए सूचकांक स्वयं नहीं बदलेगा (जब तक कि मैंने एनम के लिए एक नया मूल्य नहीं जोड़ा है)। इस मामले में, वहाँ का उपयोग करने में एक प्रदर्शन अंतर हो जाएगा integer
या varchar(255)
, या एक पूर्णांक प्रकार का उपयोग करता है और अधिक समझ बनाने?
मैं जो कारण पूछ रहा हूं, वह यह है कि रेल का enum
प्रकार स्ट्रिंग कुंजियों के लिए पूर्णांक बनाता है, लेकिन वे उपयोगकर्ता-सामना करने वाले कॉलम नहीं हैं। अनिवार्य रूप से, आप सत्यापन नहीं कर सकते हैं कि एनम मूल्य एक मान्य है, क्योंकि ArgumentError
किसी भी मान्यताओं को चलाने से पहले एक अमान्य मूल्य का कारण होगा । किसी string
प्रकार का उपयोग करने से सत्यापन की अनुमति मिलती है, लेकिन यदि प्रदर्शन लागत है तो मैं सत्यापन समस्या के आसपास ही हैक कर लूंगा।
varchar(255)
बनाम उदाहरण के लिए SQL सर्वर में कोई छुपी हुई अनुकूलन नहीं हैvarchar(260)
। SQL Server 6.x के साथ ऐसा कुछ हो सकता है लेकिन यह लंबे समय तक सही नहीं है।