2010-11-19 41 views

回答

31

NULL列不存儲。該行在開始時有一個位圖,每列有一個位表示哪些是空或非空。如果所有列在一行中都是非空的,則可以省略位圖。因此,對於具有一個或多個零點的任何給定行,添加到其中的大小應該是位圖的大小(N列表的N位向上舍入)。

在深入討論更多從文檔here

0

應該需要1個字節(0×00),但它是彌補了大部分空間的表結構,增加這個值可能會改變的東西(如添加一列),這需要更多的空間比它的數據總和。

編輯:拉勒米似乎知道比我更瞭解空:)

30

Laramie是正確的關於位圖和他鏈接到手冊中的正確的地方。然而,這幾乎是,但不完全正確的:

因此,對於具有一個或多個空任何給定行,添加到它 規模將是位圖(N位對於N列的表格,向上取整)。

必須考慮數據對齊。 HeapTupleHeader(每行)長度爲23個字節,實際列數據始終以MAXALIGN(通常爲8個字節)的倍數開始。這就留下了一個可以被空位圖使用的填充字節。實際上對於多達8列的表,NULL存儲是完全免費的。

之後,爲下一個MAXALIGN * 8(通常爲64)列分配另一個MAXALIGN(通常爲8)字節。等等總是用於用戶列的總數(全部或全部爲空)。但是,只有當行中至少有一個實際的NULL值時。

我運行了大量的測試來驗證所有這些。更多細節:

+2

添加列沒有默認值大的表通常是一個快速的操作。跨越8列和9列之間的閾值(或者使用'MAXALIGN = 8'時爲72和73')會慢嗎? – 2016-09-28 17:35:26

+1

@ PatrickBrinich-Langlois:是的,這是該機制的一個可能後果。在這些情況下,物理表的大小也會超​​過人們所預期的。由於涉及死元組等其他因素,效果不一定是線性的。如果現有的NULL位圖(每行)有空間存放另一個NULL位,則表格根本無法生長,這是常見情況。 – 2017-07-11 14:51:25

相關問題