PostgreSQL中的空间计算与节省

PostgreSQL中的空间计算与节省

我有一张这样的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兆字节。如果有的话,我能用什么技巧来挤这张桌子呢?我下面可能的想法.。

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

转换列b。M变成一个数组。我不需要搜索这些列,但我确实需要能够一次返回一个列的值。所以,如果我需要列g,我可以这样做

SELECT a, arr[5] FROM t;

我会用数组选项节省空间吗?会有超速罚则吗?

还有其他想法吗?


慕桂英3389331
浏览 701回答 3
3回答

狐的传说

在一个数组中存储几个数字字段时,我看不到什么可获得的(也没有什么可丢失的)。这个每种数值类型的大小显然,您应该使用与所需的范围分辨率兼容的最小大小的类型;这就是您所能做的一切。我不认为(但我不确定)一行列是否需要对字节进行对齐,在这种情况下,重新排序列可能会改变所使用的空间-但我不这么认为。顺便说一下,每一行都有一个修复开销,大约23个字节.

慕桂英4014372

留给用户似乎还是很奇怪的。在创建表之后,我会看到系统目录的混乱是很棘手的,但是如果重新排序是预先完成的话,这似乎并不是一个问题。要实现这一点,像存储参数这样的东西会有什么问题呢?与…有关的东西CREATE TABLE WITH column_reorder_ok这意味着“我不关心逻辑列顺序,所以不管您喜欢优化表,都要修改它”。或者,用你的术语来说,WITH column_tetris_ok. :)
打开App,查看更多内容
随时随地看视频慕课网APP