可空列可以在PostgreSQL中占用额外的空间吗?

前端之家收集整理的这篇文章主要介绍了可空列可以在PostgreSQL中占用额外的空间吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个7列的表,其中5列将为空.我将在int,text,date,boolean和money数据类型上有一个空列.此表将包含数百万行,其中包含许多空值.我担心空值将占用空间.

另外,你知道Postgres是否索引null值?我想阻止它索引null.

基本上,NULL值在NULL位图中占用1位.但它不是那么简单

如果该行中至少有一列持有一个NULL值,则空位图(每行)仅在此位置.这可能导致具有9个或更多列的表中的悖论效应:将第一个NULL值分配给一个列可能会占用磁盘上的空间,而不是向其写入一个值.相反,当最后一列变为非空时,该位将删除空位图.

在物理上,初始空位图在HeapTupleHeader(23个字节)和实际列数据之间占据1个字节,或者行OID(如果你应该使用的话),它始终以MAXALIGN的倍数开始(在现代服务器上通常为8个字节) ).这留下了由初始空位图使用的1字节的填充.

实际上,对于8列或更少的表,NULL存储是绝对免费的.
之后,另外4/8字节(通常为8)分配给下一个32/64列.等等.

更多细节in the manual及以下相关问题:

> How much disk-space is needed to store a NULL value using postgresql DB?
> Does not using NULL in PostgreSQL still use a NULL bitmap in the header?
> How many records can I store in 5 MB of PostgreSQL on Heroku?

一旦了解数据类型的填充,您可以进一步优化存储.更多在this related answer.但是案例是罕见的,您可以节省大量的空间.通常这是不值得的努力.

@Daniel已经涵盖了对索引大小的影响.

猜你在找的Postgre SQL相关文章