顯然PostgreSQL在header of each database row中存儲了一些值。在PostgreSQL中不使用NULL仍然在頭中使用NULL位圖?
如果我不在表中使用空值 - 空位圖是否仍然存在?
確定與NOT NULL
列有什麼區別?如果HEAP_HASNULL位被設置了t_infomask
顯然PostgreSQL在header of each database row中存儲了一些值。在PostgreSQL中不使用NULL仍然在頭中使用NULL位圖?
如果我不在表中使用空值 - 空位圖是否仍然存在?
確定與NOT NULL
列有什麼區別?如果HEAP_HASNULL位被設置了t_infomask
它實際上比這更復雜。
空位圖在行中每列需要一位,四捨五入爲全字節。如果實際行至少包含一個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和最有可能不會改變。 「
空位圖僅是本。如果存在,它會在固定標題之後開始,並佔用足夠的字節以使每個數據列有一位(即,t_natts位)。在這個比特列表中,1比特表示非空,0比特爲空。當位圖不存在時,所有列都假定爲非空。
http://www.postgresql.org/docs/9.0/static/storage-page-layout.html#HEAPTUPLEHEADERDATA-TABLE
所以每8列使用額外的存儲一個字節。然後對於每一百萬行將佔用一兆字節的存儲空間。看起來並不那麼重要。我會定義表格,他們需要如何定義,而不用擔心空頭。
」行中的每列一位,四捨五入到全字節「似乎不同意」之後,分配另一個MAXALIGN(4/8字節)「。這是否真正意義上的「向上取整到下一個MAXALIGN邊界」? – 2014-12-05 20:15:05