2012-04-04 55 views
5

給定一個大表(10-100萬行)向其中添加一些額外(未索引)列的最佳方式是什麼?PostgreSQL:額外列的性能影響

  1. 只需添加列。
  2. 爲每個額外的列創建一個單獨的表,並且當您想要訪問額外的值時使用連接。

答案會根據額外的列是密集的(大多是非空的)還是稀疏的(大多爲空)而改變?

回答

13

具有NULL值的列可以添加到行,而不會對數據頁的其餘部分進行任何更改in most cases。在空位掩碼中只需設置一位。所以,是的,在大多數情況下,添加稀疏列要便宜得多。

創建一個單獨的1:1表的附加列是一個好主意,這很大程度上取決於用例。它通常更昂貴。對於初學者來說,每行有28個字節的開銷(heaptuple頭+項目指針),每個表有額外的開銷。查詢中的JOIN行的成本也比單獨讀取要高得多。你需要添加一個主鍵/外鍵列和一個索引。如果在大多數查詢中不需要額外的列,那麼分割可能是個好主意。大多數情況下這是一個糟糕的主意。

在PostgreSQL中快速添加列。 正在更新列中的值可能很昂貴,因爲每個UPDATE都會寫入一個新行(由於MVCC型號)。因此,一次更新多個列是一個好主意。

Database page layout in the manual.

如何計算行大小:

+0

'有每行和大約28個字節(heaptuple首部加上項指針)的塔頂每個表的額外開銷只是爲了確認,這是否意味着具有三個4字節整數(主鍵+2 fo統治鍵)每行需要28 + 12字節? – dtgq 2016-11-27 16:39:14

+1

@DavidTan:實際上,每行總共有44個字節。 24 + 4 + 3 * 4 + 4字節的對齊填充。我在上面添加了更多詳細解釋的鏈接。 – 2016-11-27 21:01:02