2013-05-06 6 views
8

मैं समझता हूँ कि कैसे PostgreSQL (9.2) स्तंभ आकार की गणना (केबी में) न के लिए आकार, मैं इस टेबल है:Postgresql: के अनुकूलन कॉलम संख्यात्मक फ़ील्ड

Table d2: 
Column |  Type  | 
---------+---------------| 
id  | serial  | 
n  | numeric(17,2) | 

Table d4: 
Column |  Type  | 
---------+---------------| 
id  | serial  | 
n  | numeric(19,4) | 

Table d18: 
Column |  Type  | 
---------+---------------| 
id  | serial  | 
n  | numeric(35,18)| 

Table b1: 
Column |  Type  | 
---------+---------------| 
id  | serial  | 
n  | numeric(16,2) | 

Table b2: 
Column |  Type  | 
---------+---------------| 
id  | serial  | 
n  | numeric(4,2) | 

और मैं उन्हें इस कोड के साथ पॉप्युलेट क्रम में, प्रत्येक तालिका के लिए 10000 पंक्तियां;

$tests = array(2, 4, 18); 
foreach($tests AS $n) 
{ 
    $m = number_format(999999999999999.66549865, $n, '.', ''); 
    $prp_name = "insert_$n"; 
    $prp = pg_prepare($db, $prp_name, "INSERT INTO d_$n (n) VALUES ($1)"); 
    for($i = 0; $i < 10000; $i++) 
    { 
    pg_execute($db, $prp_name, array($m)); 
    } 
} 

$prp = pg_prepare($db, 'insert_b1', "INSERT INTO b1 (n) VALUES ($1)"); 
$m = 16512.67; 
for($i = 0; $i < 10000; $i++) 
{ 
    pg_execute($db, 'insert_b1', array($m)); 
} 
$prp = pg_prepare($db, 'insert_b2', "INSERT INTO b2 (n) VALUES ($1)"); 
$m = 99.36; 
for($i = 0; $i < 10000; $i++) 
{ 
    pg_execute($db, 'insert_b2', array($m)); 
} 

अब, मैं क्या समझ न है कैसे है कि हो सकता है:

SELECT pg_size_pretty(pg_total_relation_size('d2')) AS size_d2; 
size_d2 
--------- 
752 kB 

SELECT pg_size_pretty(pg_total_relation_size('d4')) AS size_d4; 
size_d4 
--------- 
752 kB 

SELECT pg_size_pretty(pg_total_relation_size('d18')) AS size_d18; 
size_d18 
---------- 
752 kB 

SELECT pg_size_pretty(pg_total_relation_size('b1')) AS size_b1; 
size_b1 
--------- 
440 kB 

SELECT pg_size_pretty(pg_total_relation_size('b2')) AS size_b2; 
size_b2 
--------- 
680 kB 

तो, d_ * टेबल एक ही आकार है, भले ही सटीक (और संग्रहीत डेटा के लंबाई) बहुत अलग है;

तालिका बी 1 बी 2 से छोटा है, भले ही एक बड़ा परिशुद्धता हो।

pg_total_relazion_size से पहले सभी तालिकाओं को फ़्लश किया गया है (वैक्यूम, एनालिज)।

मैं Postgresql's datatypes documentations में कोई जवाब नहीं ढूंढ पाया, इसलिए मैं इसे यहां पूछने वाला हूं: संख्यात्मक कॉलम की परिशुद्धता के संबंध में केबी में आकार कैसे बढ़ता है?

मैं यह परीक्षण करने के लिए यह परीक्षण कर रहा हूं कि सीएमएस के लिए डेटाबेस में मौद्रिक प्रकारों को संग्रहीत करने के लिए किस सटीकता/पैमाने का उपयोग किया जाए, मैं सभी आइटम की कीमतों के लिए केवल 1 सटीकता/स्केल मान प्राप्त करना चाहता हूं (कुल योग के लिए नहीं , जहां पैमाने 2 दशमलव का होना चाहिए)।

जितना अधिक दशमलव मैं बेहतर स्टोर कर सकता हूं, उपयोगकर्ता के लिए (इसलिए जब कोई ग्राहक किसी विशिष्ट आइटम के लिए 12 दशमलव स्टोर करने के लिए कहता है तो मेरे पास सीमा नहीं होती है), लेकिन मैं समझना चाहता हूं कि यह निर्णय डेटाबेस आकार को कैसे प्रभावित करेगा और प्रदर्शन।

उत्तर

15

manual से:

अंकीय मान शारीरिक रूप से किसी भी अतिरिक्त अग्रणी या शून्य अनुगामी बिना जमा हो जाती है। इस प्रकार, कॉलम की घोषित सटीकता और स्केल अधिकतम सीमाएं हैं, निश्चित आवंटन नहीं है। (इस अर्थ में संख्यात्मक प्रकार चर (एन) की तुलना में वर्कर (एन) के बराबर है।) वास्तविक भंडारण आवश्यकता चार दशमलव अंकों के प्रत्येक समूह के लिए दो बाइट है, साथ ही तीन से आठ बाइट ओवरहेड।

pg_total_relation_size फ़ंक्शन का परिणाम अनुक्रमणिका शामिल है। ये मान डालने कर रहे हैं में से प्रत्येक के लिए सही स्तंभ आकार है:

select pg_column_size(a) 
from (values 
    (999999999999999.62::numeric(17,2)), 
    (999999999999999.6250::numeric(19,4)), 
    (999999999999999.625000000000000000::numeric(35,18)), 
    (16512.67::numeric(16,2)), 
    (99.36::numeric(4,2)) 
) s(a) 
; 
pg_column_size 
---------------- 
      16 
      16 
      16 
      12 
      10 

तो अगर आप n दशमलव की एक अधिकतम करने के लिए उपयोगकर्ता बताना चाहते हैं बस numeric(35, n) के रूप में यह परिभाषित करते हैं। यह केवल मौजूदा दशमलव की संख्या तक अंतरिक्ष का उपयोग करेगा क्योंकि पीछे शून्य शून्य संग्रहित नहीं हैं।

1

पोस्टग्रेस्क्ल दस्तावेज़ के अनुसार, पूर्णांक में 4 बाइट्स, बिंटिंट - 8 बाइट्स हैं।

NUMERIC (p, s) 

11+ (पी/2) बाइट्स, जहां पी = परिशुद्धता, एस = पैमाने

भंडारण सांख्यिक प्रकार, कोई पैडिंग के आकार द्वारा निर्धारित के आकार। उदाहरण के लिए:

SELECT pg_column_size('123'::numeric(21,7)); --8 
SELECT pg_column_size('123.1'::numeric(21,7)); --10 
SELECT pg_column_size('123.12'::numeric(21,7)); --10 
SELECT pg_column_size('123.123'::numeric(21,7)); --10 
SELECT pg_column_size('123.1234'::numeric(21,7)); --10 
SELECT pg_column_size('123.12345'::numeric(21,7)); --12 
SELECT pg_column_size('123.123456'::numeric(21,7)); --12 
SELECT pg_column_size('123.1234567'::numeric(21,7)); --12 
संबंधित मुद्दे