1. ホーム
  2. postgresql

[解決済み] PostgreSQL におけるスペースの計算と保存

2023-08-18 02:16:04

質問

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 として格納できれば、1フィールドあたり2バイトの節約になります。

b ... m列を配列に変換します。これらの列で検索する必要はありませんが、一度に1つの列の値を返せるようにする必要があります。ですから、もし私が列gを必要とするならば、次のようなことができます。

SELECT a, arr[5] FROM t;

配列オプションでスペースを節約できるでしょうか?また、速度は低下しますか?

他のアイデアはありますか?

どのように解決するのですか?

配列に複数の数値フィールドを格納しても、得るものは何もありません(失うものもあります)。

各数値型のサイズ は明確に文書化されているので、希望する範囲の解像度と互換性のある最も小さいサイズのタイプを使用すればよいのです。

行に沿った列に何らかのバイト配列の要件がある場合、その場合、列の順序を変更することで使用されるスペースが変わる可能性がありますが、私はそうは思いません (しかし、確かではありません)。

ところで、行ごとに修正オーバーヘッドがあり、約 23 バイト .