2012-11-09 7 views
7

मैं स्तंभ प्रकार और लंबाई आकार का संदर्भ देकर अनुमानित तालिका आकार प्राप्त करने की तलाश में हूं। मैं इसके लिए pg_column_size का उपयोग करने की कोशिश कर रहा हूं।pg_column_size octet_length से छोटा कैसे हो सकता है?

फ़ंक्शन का परीक्षण करते समय, मुझे एहसास हुआ कि इस फ़ंक्शन के साथ कुछ गलत लगता है।

pg_column_size(...) का परिणाम मूल्य कभी-कभी एक ही स्ट्रिंग पर octet_length(...) से वापसी मूल्य से भी छोटा होता है।

कॉलम में संख्यात्मक वर्णों के अलावा कुछ भी नहीं है।

postgres=# \d+ t5 
          Table "public.t5" 
Column |  Type  | Modifiers | Storage | Stats target | Description 
--------+-------------------+-----------+----------+--------------+------------- 
c1  | character varying |   | extended |    | 
Has OIDs: no 

postgres=# select pg_column_size(c1), octet_length(c1) as octet from t5; 
pg_column_size | octet 
----------------+------- 
       2 |  1 
      704 | 700 
      101 | 7000 
      903 | 77000 
(4 rows) 

क्या यह बग या कुछ है? क्या कॉलम प्रकारों और लंबाई के मानों से अनुमानित तालिका आकार की गणना करने के लिए कुछ सूत्र के साथ कोई है?

उत्तर

12

मैं कहूंगा कि pg_column_sizeTOAST एड मानों के संपीड़ित आकार की रिपोर्ट कर रहा है, जबकि octet_length असम्पीडित आकार की रिपोर्ट कर रहा है। मैंने फ़ंक्शन स्रोत या परिभाषाओं की जांच करके इसे सत्यापित नहीं किया है, लेकिन यह समझ में आएगा, विशेष रूप से संख्याओं के तारों को काफी अच्छी तरह से संपीड़ित किया जाएगा। आप EXTENDED संग्रहण का उपयोग कर रहे हैं ताकि मान TOAST संपीड़न के लिए योग्य हों। the TOAST documentation देखें।

अपेक्षित डीबी आकार की गणना के लिए, यह बिल्कुल नया सवाल है। जैसा कि आप निम्न डेमो से देख सकते हैं, यह आपके तारों को संकुचित करने जैसी चीज़ों पर निर्भर करता है।

यहाँ दिखा कैसे octet_lengthpg_column_size से भी बड़ा हो सकता है, में प्रदर्शन जहां टोस्ट किक एक प्रदर्शन है सबसे पहले, के प्रश्न उत्पादन पर परिणाम जहां कोई TOAST खेलने में आता है मिलता है:।

regress=> SELECT octet_length(repeat('1234567890',(2^n)::integer)), pg_column_size(repeat('1234567890',(2^n)::integer)) FROM generate_series(0,12) n; 
octet_length | pg_column_size 
--------------+---------------- 
      10 |    14 
      20 |    24 
      40 |    44 
      80 |    84 
      160 |   164 
      320 |   324 
      640 |   644 
     1280 |   1284 
     2560 |   2564 
     5120 |   5124 
     10240 |   10244 
     20480 |   20484 
     40960 |   40964 
(13 rows) 

आइए अब दुकान है कि एक ही एक तालिका में क्वेरी आउटपुट और संग्रहित पंक्तियों का आकार प्राप्त करें:

regress=> CREATE TABLE blah AS SELECT repeat('1234567890',(2^n)::integer) AS data FROM generate_series(0,12) n; 
SELECT 13 

regress=> SELECT octet_length(data), pg_column_size(data) FROM blah; 
octet_length | pg_column_size 
--------------+---------------- 
      10 |    11 
      20 |    21 
      40 |    41 
      80 |    81 
      160 |   164 
      320 |   324 
      640 |   644 
     1280 |   1284 
     2560 |    51 
     5120 |    79 
     10240 |   138 
     20480 |   254 
     40960 |   488 
(13 rows) 
+0

आपको बहुत बहुत धन्यवाद ... – KIM

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