2012-11-23 134 views
3

我在Oracle Linux Server版本6.3上使用PostgreSQL 9.2。使用頁面佈局的表大小

根據the storage layout documentation,頁面佈局成立:

  • PageHeaderData(24字節)
  • 點的n個項(索引項/表項)AKA ItemIdData(4字節)
  • 自由空間
  • n個項目
  • 特殊空間

我測試了它,使一些公式來估算表大小的預期...(TOAST概念可能被忽略。)

postgres=# \d t1; 

         Table "public.t1" 
    Column ','   Type   ','   Modifiers 
---------------+------------------------+------------------------------ 
code   |character varying(8) |not null 
name   |character varying(100) |not null 
act_yn  |character(1)   |not null default 'N'::bpchar 
desc   |character varying(100) |not null 
org_code1  |character varying(3) | 
org_cole2  |character varying(10) | 

postgres=# insert into t1 values(
'11111111', -- 8 
'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111', <-- 100 
'Y', 
'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111', <-- 100 
'111', 
'1111111111'); 

postgres=# select * from pgstattuple('t1'); 
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent 
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+-------------- 
     8192 |   1 |  252 |   3.08 |    1 |   252 |    3.08 |  7644 |  93.31 
(1 row) 

爲什麼tuple_len 252,而不是249? (「所有列的最大長度的222字節」PLUS 「27字節的元組頭,後面跟着可選的空位圖,可選的對象ID字段和用戶數據」)3個字節從哪裏來?

我的配方有什麼問題嗎?

+0

對齊填充?我沒有查看詳細信息。 –

+0

DOCS可能與HeapTupleHeader的大小有關。我將它編輯爲27. – KIM

+0

對於那些想知道:函數'pgstattuple(text)'由附加模塊[pgstattuple]提供(http://www.postgresql.org/docs/current/interactive/pgstattuple.html) 。 –

回答

5

您的計算關閉了幾個點。

    varchartext
  • 存儲大小爲(引用手動here):

在短字符串(最多126個字節)的存儲要求是1字節 加上實際的串,其中包含字符 的空格填充。較長的字符串具有4字節的開銷而不是1. 長字符串被系統自動壓縮,因此磁盤上的物理需求可能會更少。

大膽強調我的意見,以解決問題。

  • HeapTupeHeader occupies 23 bytes,不是27字節。

  • 由於數據對齊(8的倍數)而導致的1個字節的填充字,在此情況下用於NULL位掩碼。

  • 沒有填充類型varchar

所以,實際的計算公式是:

 23 -- heaptupleheader 
    + 1 -- NULL bit mask (or padding if all columns are NOT NULL) 
    + 8 -- columns 
    + 100 
    + 1 
    + 100 
    + 3 
    + 10 
    + 6 -- 1 byte overhead per varchar column, 6 columns 

- > 字節。

我寫了幾個相關的答案,你可以找到他們大多數鏈接到this one(看右邊的鏈接列表)。

+0

非常感謝你... – KIM