PostgreSQL中TIMESTAMP字段存Null能否节省存储空间?
可空TIMESTAMPTZ与非空带默认值的存储空间对比
在PostgreSQL中,TIMESTAMPTZ属于固定宽度类型,每个非NULL值占用8字节存储空间。针对你的场景,两种字段定义的存储空间差异如下:
若使用
update_at TIMESTAMPTZ(可空):
未被修改的行中该字段为NULL,此时PostgreSQL不会存储这8字节的时间数据,仅会在该行的NULL位图中用一个位标记该字段为NULL。NULL位图的开销极小——每8个可空字段仅占用1字节,单字段的这个开销几乎可以忽略。若使用
update_at TIMESTAMPTZ NOT NULL DEFAULT NOW():
所有行(包括从未修改的行)都会存储一个8字节的时间戳值,没有例外。
由于你的场景里大部分行不会被修改,使用可空的TIMESTAMPTZ定义能显著节省存储空间——每一行未修改的行都能省下8字节,对于海量数据的表来说,累计的空间节省会非常可观。
补充:你提到的“固定宽度可空字段无论值是否为Null存储空间相同”的情况并不适用于PostgreSQL。PostgreSQL中,固定宽度可空字段的NULL值不会占用该字段本身的存储空间,仅通过NULL位图标记。
内容的提问来源于stack exchange,提问作者Greenhill
相关产品推荐
相关产品推荐

