我有一个包含7列的表,其中5列将为空.我将在int
、text
、date
、boolean
和money
个数据类型上有一个空列.此表将包含数百万行,其中包含许多空值.我担心空值会占用空间.
另外,你知道Postgres是否索引空值吗?我想防止它索引空值.
我有一个包含7列的表,其中5列将为空.我将在int
、text
、date
、boolean
和money
个数据类型上有一个空列.此表将包含数百万行,其中包含许多空值.我担心空值会占用空间.
另外,你知道Postgres是否索引空值吗?我想防止它索引空值.
基本上,NULL
个值在空位图中占据1 bit.但事情没那么简单.
只有当行中至少有一列包含NULL
值时,才会分配null bitmap(每行).在包含9列或更多列的表中,这可能会导致一种看似矛盾的效果:将前NULL
个值指定给一列可能比向其写入值占用更多磁盘空间.相反,从行中删除最后一个空值也会删除空位图.
从物理上讲,初始空位图在HeapTupleHeader
(23字节)和实际列数据或第OID
行(如果您仍应使用该行)之间占据1 byte,这always以MAXALIGN
(通常为8 bytes)的倍数开始.这会留下1 byte个填充空间,供初始空位图使用.
In effect, NULL storage is absolutely free for tables of 8 columns or less (including dropped, but not yet purged columns).
After that, another MAXALIGN
bytes (typically 8) are allocated for the next MAXALIGN * 8
columns (typically 64). Etc.
更多详情请参见以下相关问题:
一旦了解了数据类型的对齐填充,就可以进一步优化存储:
但这种情况很少见,可以节省大量空间.通常情况下,这不值得付出努力.
@Daniel已经涵盖了对索引大小的影响.
Note表示dropped columns(尽管现在不可见)将保留在系统目录中,直到重新创建表.这些僵尸可以强制分配(放大的)空位图.见: