最佳答案
我有一张这样的桌子:
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。如果有的话,我可以用什么技巧来压缩这张桌子呢?下面是我可能的想法。
将 real
值转换为 integer
。如果它们可以存储为 smallint
,那么每个字段将节省2个字节。
Convert the columns b .. m into an array. I don't need to search on those columns, but I do need to be able to return one column's value at a time. So, if I need column g, I could do something like
SELECT a, arr[5] FROM t;
使用数组选项是否会节省空间? 是否会有速度损失?
还有别的办法吗?