私は次のような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)
);
上記の合計は、1行あたり最大50バイトです。私の経験では、上記のユーザー作成インデックスさえなくても、システムオーバーヘッドのためにさらに40%から50%が必要です。したがって、1行あたり約75バイトです。テーブルには非常に多くの行があり、場合によっては1,450億行を超える可能性があるため、テーブルは13〜14テラバイトをプッシュします。このテーブルを圧縮するために、もしあれば、どのようなトリックを使用できますか?以下の私の考えられるアイデア...
real
値をに変換しますinteger
。として保存できる場合smallint
は、フィールドごとに2バイト節約できます。
列b..mを配列に変換します。これらの列を検索する必要はありませんが、一度に1つの列の値を返すことができる必要があります。したがって、列gが必要な場合は、次のようなことができます。
SELECT a, arr[5] FROM t;
配列オプションでスペースを節約できますか?速度ペナルティはありますか?
他のアイデアはありますか?