【发布时间】:2011-02-27 08:01:20
【问题描述】:
我在 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-14 TB。如果有的话,我可以使用什么技巧来压缩这张桌子?下面是我可能的想法...
将real 值转换为integer。如果它们可以存储为smallint,则每个字段可以节省 2 个字节。
将列 b .. m 转换为数组。我不需要搜索这些列,但我确实需要能够一次返回一列的值。所以,如果我需要 g 列,我可以这样做
SELECT a, arr[5] FROM t;
我会使用数组选项节省空间吗?会不会有速度惩罚?
还有其他想法吗?
【问题讨论】:
-
PostgreSQL 文档建议避免对exact floating point number representation 使用
real和double precision类型(例如存储会计值)。请改用numeric数据类型。如果这些real值用于会计或精确结果操作,只是一个提示。
标签: postgresql database-design storage bigdata