我正在尝试创建表来存储大量数据,我想知道是否可以使用 null TIMESTAMP 来节省存储空间?
我有一个变量 update_at,每当我修改关联的行时,该变量都会更新为 NOW() - 大多数行都不会被修改。在这种情况下,在创建表时,与 update_at TIMESTAMPTZ NOT NULL DEFAULT NOW() 相比,update_at TIMESTAMPTZ 会节省一些空间吗?
鉴于使用一个where条件检查字符串是否有字母e(不区分大小写)sql查询,我知道:
对于像 nullable int 这样的固定宽度字段,所需的存储空间是 无论值是否为空,始终相同。
对于可变宽度可为空字段,值“NULL”采用零字节 存储空间(忽略存储该值是否为空的位 或不)。
但是 TIMESTAMPTZ 或 DATE 数据类型呢? 我不确定它们是“可变宽度可为空字段”还是“固定宽度可为空字段” - 因此,不确定我是否可以使用 Null 节省一些存储空间。
非常感谢您的帮助!
一个简单的测试可以解决这个问题,因为
--create tables with 1 million rows
create table test_null as
select id::int8, null::timestamptz
from generate_series(1, 1000000) as id;
create table test_notnull as
select id::int8, now()::timestamptz
from generate_series(1, 1000000) as id;
--refresh table statistics
analyze test_null;
analyze test_notnull;
检查储藏室中的桌子尺寸
select 'test_null' table_name, pg_size_pretty(pg_total_relation_size('test_null')) size
union all
select 'test_notnull' table_name, pg_size_pretty(pg_total_relation_size('test_notnull')) size;
表名 | 尺寸 |
---|---|
测试_空 | 35MB |
测试_notnull | 42MB |