2014-10-29 10 views
13

PostgreSQL प्रकार bytea और bit varying के बीच अंतर समान ध्वनि:PostgreSQL: "bytea" और "सा अलग" प्रकार

प्रलेखन में अधिकतम आकार का उल्लेख नहीं है। क्या यह 1GB है character varying?

मैं दो अलग-अलग उपयोग के मामलों है, दोनों पंक्तियों के लाखों लोगों के साथ एक मेज के ऊपर:

भंडारण MD5 हैश

कि 16 बाइट या एक bit(128) की लंबाई के साथ एक bytea होगा। इसका उपयोग इस प्रकार किया जाएगा:

  • डीडुप्लिकेशन: GROUP BY का भारी उपयोग, मुझे लगता है कि एक सूचकांक के साथ।
  • सटीक मिलान के लिए WHERE md5 = के साथ क्वेरी।
  • मानव उपयोग के लिए हेक्स स्ट्रिंग के रूप में प्रदर्शित करना।

भंडारण मनमाने ढंग से बाइनरी डेटा लंबाई के लिए 4kB तक अलग से बाइनरी डेटा के

स्ट्रिंग्स:

  • बिटवाइस आपरेशन एक निश्चित मुखौटा मिलान तार खोजने के लिए। इस पोस्ट के अंत में उदाहरण।
  • कुछ बाइट निकालने, उदाहरण के लिए मेरी स्ट्रिंग में बाइट 14 का पूर्णांक मान प्राप्त करें।
  • कुछ deduplication।

bit varying का उपयोग करके बिटवाई ऑपरेशन के लिए कार्य उदाहरण। मुखौटा X'00FF00 'है और यह केवल पंक्ति X'AAAAAA' देता है। मैंने उदाहरण के लिए तारों को छोटा कर दिया लेकिन यह 4kb तक, उनकी पूर्ण लंबाई से अधिक होगा। क्या bytea के साथ कुछ ऐसा करना संभव है?

CREATE TABLE test1 (mystring bit varying); 
INSERT INTO test1 VALUES (X'AAAAAA'), (X'ABCABC'); 
SELECT * FROM test1 WHERE mystring & X'00FF00' = X'00AA00'; 

bytea और bit varying में से कौन अधिक उपयुक्त है?

मैंने देखा कि UUID प्रकार बिल्कुल 16 बाइट्स स्टोर करने के लिए बनाया गया है, क्या एमडी 5 स्टोर करने के लिए यह कोई फायदा होगा?

+0

मैं एक जवाब के रूप में इस नहीं डाल रहा हूं क्योंकि मेरे पास कोई विशेषज्ञ यहाँ हूँ "बिल्डिंग, प्रोग्रामिंग, और Administratoring PostgreSQL डेटाबेस के लिए व्यापक गाइड", लेकिन इस बारे में पढ़ने में , ऐसा प्रतीत होता है कि बाइटा अधिक उचित विकल्प है, विशेष रूप से इसका हेक्स प्रारूप का उपयोग करना। PostgreSQL के अपने शब्दों में "हेक्स प्रारूप बाहरी अनुप्रयोगों और प्रोटोकॉल की एक विस्तृत श्रृंखला के साथ संगत है, और यह बचने के प्रारूप की तुलना में रूपांतरित करने के लिए तेज़ हो जाता है, इसलिए इसका उपयोग प्राथमिकता प्राप्त है। Http://www.postgresql.org/docs /9.1/static/datatype-binary.html (विशेष रूप से अनुभाग 8.4.1) और यहां एक सूअर का जवाब: http://stackoverflow.com/questions/15982737/postgresql-data-type-for-md5-message-digest – JNevill

+0

I 'हेक्स' और' एस्केप 'को समझ लिया गया है [इनपुट और आउटपुट के लिए बाहरी प्रारूप] (http://www.postgresql.org/docs/9.3/static/datatype-binary.html#DATATYPE-BINARY-TABLE) केवल। आंतरिक मूल्य द्विआधारी हैं, इसलिए यह मेरे मामले में कुछ भी नहीं बदलेगा जब तक कि मैं बड़ी मात्रा में द्विआधारी मूल्यों का आयात या निर्यात नहीं कर रहा हूं। – Victor

+0

खैर .. आंतरिक रूप से यह सभी बाइनरी है। ऐसा लगता है कि यह आपके आरडीबीएमएस में समर्थन के लिए नीचे आता है और जो भी टूल्स आप इसके साथ बातचीत करने के लिए उपयोग करते हैं, जो मुझे 'बाइटा' पर धक्का देता है। सैद्धांतिक रूप से एक चर (16) और बिट (128) टा स्टोर करने के लिए बाइट्स की एक ही संख्या है, इसलिए यह आंतरिक परिप्रेक्ष्य से धोने की तरह है (अनदेखा कर रहे हैं कि CHAR() स्टोर नहीं कर सकते हैं। मैं आश्चर्यचकित हूं कि stackoverflow.com सुपर प्रतिभाओं ने अभी तक इसका उत्तर नहीं दिया है। यह एक अच्छा सवाल है। – JNevill

उत्तर

10

सामान्यतः, यदि आप बिटवाई ऑपरेशंस का उपयोग नहीं कर रहे हैं तो आपको bytea का उपयोग करना चाहिए।

मैं bytea में बड़ा मान संग्रहीत और फिर बिटवाइज़ के संचालन के लिए bit varying को सबस्ट्रिंग परिवर्तित जहां संभव हो, ज्यादातर क्योंकि ग्राहकों byteabit varying की तुलना में अधिक लगातार समझते हैं और मैं/हे प्रारूप अधिक कॉम्पैक्ट है।

MD5 मान bytea के रूप में संग्रहीत किए जाने चाहिए। उन पर बिटवाई ऑपरेशंस का कोई मतलब नहीं है, और आप आम तौर पर उन्हें बाइनरी के रूप में ले जाना चाहते हैं।

मुझे लगता है कि वास्तव में bit varying दो का उपयोग करता है:

  • झंडे क्षेत्रों सचमुच सा कर रहे हैं कि तार की दुकान करने के लिए; और
  • आंतरिक गणना

किसी और काफी सब कुछ के लिए के लिए एक अंतरिम डेटा प्रकार के रूप में, bytea का उपयोग करें।

यदि आप ऐसा करते हैं तो 4k बिटफील्ड को स्टोर करने से रोकने के लिए कुछ भी नहीं है।

+0

बिट स्ट्रिंग्स (5 या 8 बाइट्स) की तुलना में बाइनरी स्ट्रिंग्स (1 या 4 बाइट्स) के लिए निचले ओवरहेड पर आधारित आपकी सिफारिश किस डिग्री के लिए है? –

+0

@ डेविडजम्स ज्यादातर यह तर्कसंगत रूप से क्लीनर है, और यहां बिट स्ट्रिंग्स का उपयोग करने का कोई अच्छा कारण नहीं है। बिट बिट ऑपरेशंस की आवश्यकता होने पर बिट स्ट्रिंग का उपयोग करें, अन्यथा नहीं। –

6
  1. ऐसा लगता है कि bytea की अधिकतम लंबाई 1 जीबी है। [1]
  2. बिटवाई ऑपरेशन के लिए bit varying (स्पष्टीकरण नीचे देखें)
  3. MD5 हैश का उपयोग bytea को संग्रहीत करने के लिए। यह तुलना में bit varying
  4. लाभ का उपयोग कर UUIDUUID एल्गोरिथ्म किसी भी तरह अपनी विशिष्टता, न केवल अपनी तालिका में, बल्कि अपने डेटाबेस में या यहाँ तक कि अपने डेटाबेस (भले ही आप अपने आवेदन में UUID उत्पन्न) भर की गारंटी देता है है कम संग्रहण का समय लगेगा। मुझे लगता है कि यदि आप डैश के बिना यूयूआईडी का उपयोग कर रहे हैं तो यह UUID में भंडारण, तुलना और सॉर्टिंग के लिए अधिक कुशल होगा (bytea और UUID के बीच तुलना नीचे देखें)।

बिटवाइज़ आपरेशन उपयोग के लिए bit varying

आप भंडारण के बारे में चिंता करते हैं: bit varyingbytea से अधिक संग्रहण लेता है। क्या आप ठीक हैं तो आप समारोह की तुलना की कोशिश करनी चाहिए कि वे दोनों प्रस्ताव:

bit varying बनाम bytea

अब तक मैं bit varying देख सकते हैं आप बिटवाइज़ आपरेशन करने के लिए हालांकि bytea आम तौर पर जिस तरह से स्वीकार किया जाता है और अधिक उपयुक्त हो जाएगा मनमाने ढंग से डेटा स्टोर करने के लिए।

पोस्टग्रेएसक्यूएल एक bytea ऑपरेटर प्रदान करता है: concatenation। आप concatenation ऑपरेटर || का उपयोग कर byte मान को अन्य bytea मान में जोड़ सकते हैं। [1]

ध्यान दें कि आप समानता/असमानता के लिए भी दो bytea मान की तुलना नहीं कर सकते हैं। आप निश्चित रूप से bytea मान को CAST() का उपयोग कर किसी अन्य मान में परिवर्तित कर सकते हैं, और यह अन्य ऑपरेटरों को खोलता है।[1]

तुलना UUID और के बीच bytea

create table u(uuid uuid primary key, payload character(300)); 
    create table b(bytea bytea primary key, payload character(300)); 

    INSERT INTO u             
    SELECT uuid_generate_v4()              
    FROM generate_series(1,1000*1000); 

    INSERT INTO b             
    SELECT random_bytea(16)              
    FROM generate_series(1,1000*1000); 

    VACUUM ANALYZE u; 
    VACUUM ANALYZE b; 

    ## Your table size 
    SELECT pg_size_pretty(pg_total_relation_size('u')); 
    pg_size_pretty 
    ---------------- 
    81 MB 

    SELECT pg_size_pretty(pg_total_relation_size('b')); 
    pg_size_pretty 
    ---------------- 
    101 MB 

    ## Speed comparison 
    \timing on 

    ## Common select 
    select * from u limit 1000; 
    Time: 1.433 ms 

    select * from b limit 1000; 
    Time: 1.396 ms 

    ## Random Select 
    SELECT * FROM u OFFSET random()*1000 LIMIT 10000; 
    Time: 42.453 ms 

    SELECT * FROM b OFFSET random()*1000 LIMIT 10000; 
    Time: 10.962 ms 

निष्कर्ष: मुझे नहीं लगता कि अधिक UUID इसकी विशिष्टता और छोटे आकार के सिवाय का उपयोग कर लाभ होगा (डालने के लिए तेजी से हो जाएगा)

नोट: कोई सूचकांक, वहाँ केवल एक ही कनेक्शन है

कुछ स्रोत:

  1. PostgreSQL: पुस्तक
संबंधित मुद्दे