我有一个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;
使用数组选项会节省空间吗?会有速度惩罚吗?
还有其他想法吗?
real
和double precision
类型来表示精确浮点数(例如用于存储会计价值)。相反,应该使用numeric
数据类型。这只是一个提示,以防那些real
值被用于会计或精确结果操作。 - sɪʒɪhɪŋ βɪstɦa kxɐll