2015-08-24 6 views
7

मैं कॉलम "आईडी" के तहत, PostgreSQL v9.4 तालिका में UUID v4 मान संग्रहीत कर रहा हूं।PostgreSql तालिका में UUID, CHAR, और VARCHAR के बीच प्रदर्शन अंतर?

जब मैं तालिका बनाता हूं, तो क्या मैं "आईडी" कॉलम को VARCHAR(36), CHAR(36), या UUID डेटा प्रकार के रूप में परिभाषित करता हूं या नहीं, प्रदर्शन में पढ़ने में कोई अंतर है?

धन्यवाद!

+0

जहां तक ​​मुझे पता है, यूयूआईडी प्रकार 16 बाइट्स का उपयोग करता है, मूल रूप से यूयूआईडी को यह संग्रहीत करता है कि यह क्या है: 128-बिट पूर्णांक। एक 'चार (36) 'या' वर्चर (36) '36 बाइट्स का उपयोग करेगा। हालांकि, मुझे लगता है कि यह कहां दस्तावेज नहीं है, हालांकि। इसके अलावा, आप और यदि आपके UUID अपने प्रमुख होने जा रहा है कैसे PostgreSQL तालिका/सूचकांक क्लस्टरिंग करता है के असर के बारे में पता करने की आवश्यकता है आप क्लस्टर विकल्प का उपयोग करने की योजना है। –

+0

http://simononsoftware.com/how-to-store-uuids-in-postgresql/ –

उत्तर

14

uuid का उपयोग करें। PostgreSQL एक कारण के लिए देशी प्रकार है।

यह यूआईआईडी को 128-बिट बाइनरी क्षेत्र के रूप में आंतरिक रूप से संग्रहीत करता है। आपके अन्य प्रस्तावित विकल्प इसे हेक्साडेसिमल के रूप में संग्रहीत करते हैं, जो तुलना में बहुत अक्षम है।

इतना ही नहीं, लेकिन:

  • uuid आदेश देने के लिए एक सरल bytewise तरह से करता है। text, char और varchar कॉलेशन और लोकेशंस पर विचार करें, जो यूयूआईडी के लिए गैरकानूनी है।

  • uuid का केवल एक कैननिक प्रतिनिधित्व है। पाठ आदि के लिए भी यह सच नहीं है; आप बनाम लोअर केस हेक्स, उपस्थिति या {...-...} रों आदि

सिर्फ कोई सवाल ही नहीं है के अभाव ऊपरी विचार करने के लिए किया है। uuid का उपयोग करें।

केवल अन्य प्रकार है कि किसी भी समझ में आता है bytea है, जो कम से कम सीधे UUID के 16 बाइट्स स्टोर करने के लिए इस्तेमाल किया जा सकता है। यह वही है जो मैं करता हूं अगर मैं उन प्रणालियों का उपयोग कर रहा था जो बुनियादी सेट के बाहर डेटा प्रकारों का सामना नहीं कर सके, जैसे किसी प्रकार का वास्तव में गूंगा ओआरएम।

2

यूयूआईडी सबसे तेज़ होगा क्योंकि इसकी 128 बिट्स -> 16 बाइट्स और तुलना संख्यात्मक रूप से की जाती है।

चार (36) और वर्चर (36) एक जैसा और धीमा प्रतीत होता है: http://www.depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/

सर्वर को प्रत्येक चरित्र के लिए मूल्य समाप्त करने या नहीं पढ़ने के लिए ईओएफ की जांच करनी चाहिए।

भी टेक्स्ट तुलना संख्यात्मक तुलना से धीमी है। और चूंकि यूयूआईडी में 16 बाइट होते हैं, यूयूआईडी की तुलना 36 वर्णों के दो ग्रंथों की तुलना में बहुत तेज है।

प्रदर्शन के लिए मूल यूयूआईडी का उपयोग करें।

+0

आपका स्पष्टीकरण ग़लत है।यहां 'char' और' varchar' के बीच कोई महत्वपूर्ण प्रदर्शन अंतर नहीं है, कम से कम PostgreSQL द्वारा संग्रहीत किया गया है। दोनों को आंतरिक रूप से 'वरलेना' के रूप में संग्रहीत किया जाता है। इसके अलावा, एक यूयूआईडी 16 बाइट्स (128 बिट्स) है; मुझे नहीं पता कि आपको "5 हेक्साडेसिमल मान" कहां मिलते हैं। –

+0

ठीक है, मैंने यह भी कहा कि यह 128 बिट्स और 16 बाइट्स है। और 5 हेक्साडेसिमल मान परिभाषा से आता है, कृपया पढ़ें: http://stackoverflow.com/questions/32188497/mysql-custom-alphabetical-column-order –

+0

char और varchar के समान होने के नाते, हाँ, आप सही हैं: http : //www.depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/ –

0

सूचकांक आकार शायद सबसे उल्लेखनीय अंतर है: VARCHAR के लिए लगभग 86% अधिक।

एक प्रदर्शन परिप्रेक्ष्य से मैंने PostgreSQL 9.5 में महत्वपूर्ण अंतर नहीं देखा।

संबंधित मुद्दे