2011-02-15 17 views

回答

18

它實際上比這更復雜。

空位圖在行中每列需要一位,四捨五入爲全字節。如果實際行至少包含一個NULL值並且在這種情況下被完全分配,那只有在那裏。約束不會直接影響到這一點。 (當然,如果您的表的所有字段都是NOT NULL,則永遠不會有空位圖。)

「堆元組標題」(每行)長度爲23個字節。之後,實際數據從MAXALIGN的倍數開始,這通常是64位OS上的8個字節(32位OS上是4個字節)。從你的PostgreSQL二進制文件目錄運行以下命令以root身份得到一個明確的答案:

./pg_controldata /path/to/my/dbcluster 

在一個典型的Debian安裝的Postgres 9.3的,這將是:

sudo /usr/lib/postgresql/9.3/bin/pg_controldata /var/lib/postgresql/9.3/main 

無論哪種方式,有一個免費在頭部和數據的對齊開始之間的字節,空位圖可以利用該字節。只要你的表有8欄或更少,NULL存儲是有效的絕對自由(就磁盤空間而言)。

在此之後,另一個MAXALIGN(通常爲8個字節)被分配用於零位圖(加填充)以覆蓋另一個(通常)64名的字段。等

這是至少有效的版本8.4 - 9.6和最有可能不會改變。 「

+0

」行中的每列一位,四捨五入到全字節「似乎不同意」之後,分配另一個MAXALIGN(4/8字節)「。這是否真正意義上的「向上取整到下一個MAXALIGN邊界」? – 2014-12-05 20:15:05

3

空位圖僅是本。如果存在,它會在固定標題之後開始,並佔用足夠的字節以使每個數據列有一位(即,t_natts位)。在這個比特列表中,1比特表示非空,0比特爲空。當位圖不存在時,所有列都假定爲非空。

http://www.postgresql.org/docs/9.0/static/storage-page-layout.html#HEAPTUPLEHEADERDATA-TABLE

所以每8列使用額外的存儲一個字節。然後對於每一百萬行將佔用一兆字節的存儲空間。看起來並不那麼重要。我會定義表格,他們需要如何定義,而不用擔心空頭。

相關問題