我有一张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 吗?