我有一个包含7列的表,其中5列将为空。我将在int、text、date、boolean和money数据类型上设置空列。此表将包含数百万行,其中包含许多空值。我担心空值会占用空间
另外,您知道Postgres是否索引空值吗?我想防止它索引空值
基本上,NULL值占据空位图中的1位。但并不是那么简单
null位图(每行)仅在该行中至少有一列包含null值时分配。在包含9列或更多列的表中,这可能会导致一种看似矛盾的效果:将第一个NULL值赋给一列可能比向其写入值占用更多磁盘空间。相反,从行中删除最后一个空值也会删除空位图
从物理上讲,初始空位图在HeapTupleHeader(23个字节)和实际列数据或行OID(如果您仍在使用)之间占据1个字节,并且始终以MAXALIGN的倍数开始(通常8个字节)。这样,初始空位图将使用1字节的填充
实际上,空存储对于8列或更少的表是绝对免费的(包括已删除但尚未清除的列)。
然后,为下一个maxallign*8列(通常为64)分配另一个maxallign字节(通常为8)。等等
更多详细信息,请参见手册和相关问题:
- 使用postgresql DB存储空值需要多少磁盘空间
- 在PostgreSQL中使用NULL是否仍在标头中使用NULL位图
- 我可以在Heroku上的5MB PostgreSQL中存储多少条记录
了解数据类型的对齐填充后,可以进一步优化存储:
- PostgreSQL中的空间计算与节省
但是,在这种情况下,可以节省大量空间的情况很少。通常情况下,这不值得付出努力
@Daniel已经介绍了索引大小的影响
注意删除的列(虽然现在不可见)将保留在系统目录中,直到重新创建表为止。这些僵尸可以强制分配(放大的)空位图。见:
- 在大型数据集上删除Postgres中的列