我有一张pg的桌子,像这样:

CREATE TABLE t (
    a BIGSERIAL NOT NULL,               -- 8 b
    b SMALLINT,                         -- 2 b
    c SMALLINT,                         -- 2 b
    d REAL,                             -- 4 b
    e REAL,                             -- 4 b
    f REAL,                             -- 4 b
    g INTEGER,                          -- 4 b
    h REAL,                             -- 4 b
    i REAL,                             -- 4 b
    j SMALLINT,                         -- 2 b
    k INTEGER,                          -- 4 b
    l INTEGER,                          -- 4 b
    m REAL,                             -- 4 b
    CONSTRAINT a_pkey PRIMARY KEY (a)
);

以上每行加起来最多50字节.我的经验是,我需要另外40%到50%的系统开销,甚至没有任何用户创建的上述索引.每行大约75字节.我会在表中有很多很多行,可能会超过1450亿行,所以表的容量将达到13-14TB.如果有的话,我可以用什么技巧来压缩这张桌子?下面是我可能的 idea ...

real个值转换为integer.如果它们可以存储为smallint,则每个字段可以节省2字节.

转换b列..我进入一个array.我不需要搜索这些列,但我需要能够一次返回一列的值.所以,如果我需要g列,我可以这样做

SELECT a, arr[5] FROM t;

使用数组选项可以节省空间吗?会有超速处罚吗?

还有其他 idea 吗?

推荐答案

我认为在一个数组中存储几个数字字段没有什么好处(也没有什么损失).

size of each numerical type是明确的文件,你应该简单地使用最小尺寸的类型与你想要的范围分辨率兼容;这就是你所能做的.

我不认为(但我不确定)行中的列是否需要字节对齐,在这种情况下,列的重新排序可能会改变所使用的空间,但我不这么认为.

顺便说一句,每行有固定开销,大约23 bytes.

Postgresql相关问答推荐

DBT-DBT依赖于未找到的源

无法将 json 范围读取为 pgtype.Int4range

如何在 postgres where 子句中使用 or 对条件进行组合或分组

Postgres数据库系统已准备好接受连接和docker compose

如何在 sequelize 使用 db postgres 中通过外键更新记录和更新包含许多记录关系

计算每行的多列中的非 NULL 元素

连接 Supbase Postgresql 数据库时,Stepzen Graphiql 资源管理器中的主机名解析错误

使用 postgresql Select 整数作为位和状态表

Hibernate 将用户模型保存到 Postgres

OpenShift:如何从我的 PC 连接到 postgresql

将 Postgres 与 Grails 一起使用

Postgres 图像未创建数据库

如何从 WSL 连接到 windows postgres 数据库

PostgreSQL INSERT 插入一个枚举数组

如何使 Java 和 Postgres 枚举一起工作以进行更新?

为 postgresql 存储过程设置隔离级别

是否可以在 CSV 格式的 Postgres COPY 命令中关闭报价处理?

SQL 基本类型:integer vs int?

使用 Postgres 在 Rust 的 Diesel 库中添加时间戳

实时监控 PostgreSQL 查询的应用程序?