为何PostgreSQL中DECIMAL(10,2)与INT列存储大小看似相同?
PostgreSQL中DECIMAL(10,2)与INT表存储大小一致的原因
这是PostgreSQL的页存储机制和单条记录实际开销共同导致的结果,具体原因如下:
页存储的基本规则:PostgreSQL默认以8KB(8192字节)作为数据存储的基本页单元,表的存储空间按页分配——哪怕数据只占页的一小部分,也会占用整个页的空间。你插入的226行数据,不管是INT列还是DECIMAL(10,2)列,总数据量都没超过单个8KB页的可用容量,因此两表都只占用1个页,
pg_relation_size返回的都是8192字节。单条记录的实际开销:DECIMAL(10,2)的单值存储开销并没有你预期的比INT大很多。PostgreSQL中,INT固定占用4字节;而DECIMAL(10,2)属于精度≤18的数值,实际存储开销仅为6字节左右,再加上每行固定的23字节行头开销,单条记录的大小差异很小。226行的总数据量远小于8KB页的容量,所以这种差异不会触发多页分配。
分页触发条件:当插入第227行时,两表的总数据量都超过了单个8KB页的可用空间,PostgreSQL会自动分配第二个8KB页,因此两表的存储大小都变为16KB。
内容的提问来源于stack exchange,提问作者Mohammed Khaled ALMajhali
相关产品推荐
相关产品推荐

