Postgresql

如果第 8 位之後的所有欄位都不是 NULL,為什麼 PostgreSQL 會創建一個額外的 NULL 點陣圖?

  • February 9, 2018

我沒有提到行標題中包含的 1 字節空點陣圖,該點陣圖可用於標記前 8 列中的任何一個的空值。看:

https://stackoverflow.com/questions/12145772/do-nullable-columns-occupy-additional-space-in-postgresql/12147130#12147130

我的問題是關於 Postgresql 為每一行添加的新的 8 字節空點陣圖:

  • 有 9 列或更多列
  • 並包括至少一個 null

我通過創建/填充一些表並使用pgstattuple擴展檢查行大小進行了一些測試,我觀察到了這種奇怪的行為。

即使第 9(也是最後)列是使用NOT NULL約束 創建的,也會創建新的空點陣圖。

你有什麼解釋嗎?還是我做錯了什麼?

您的問題的答案也在連結的答案中:

NOT NULL約束不會直接影響這一點。

NULL 點陣圖的大小根本NOT NULL不受約束影響。

每行只有一個(或沒有)NULL 點陣圖。永遠不要*“附加”* NULL 點陣圖。對於多達 8 個使用者列的行,使用行標題和列數據(或可選的 OID)之間的備用字節。如果使用者列超過 8 個,則 NULL 點陣圖擴展MAXALIGN通常為 8 個字節)。列數據向後移動相同的字節數。導致單個NULL 點陣圖。

即使不為帶有NOT NULL約束的尾隨列擴展點陣圖似乎是合理的,也可能會出現複雜情況。像:刪除約束將不得不觸發整個表重寫。

即使可以處理,我希望沒有核心開發人員願意為這種罕見的特殊情況使程式碼複雜化以每行節省幾個字節。

引用自:https://dba.stackexchange.com/questions/197425