Calcul et d'économiser de l'espace dans PostgreSQL

J'ai une table dans pg comme suit:

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)
);

Ci-dessus ajoute jusqu'à 50 octets par ligne. Mon expérience est que j'ai besoin d'un autre 40% à 50% de la charge du système, sans même que l'utilisateur créé des index à la ci-dessus. Ainsi, environ 75 octets par ligne. Je vais avoir beaucoup, beaucoup de lignes dans la table, potentiellement, la hausse de 145 milliards de lignes, de sorte que le tableau va être repousser 13-14 téraoctets. Quels trucs, le cas échéant, pourrais-je l'utiliser pour compacter ce tableau? Mes idées possibles ci-dessous ...

Convertir le real valeurs de integer. Si ils peuvent stockées en tant que smallint, c'est une économie de 2 octets par champ.

Convertir les colonnes b .. m dans un tableau. Je n'ai pas besoin de faire une recherche sur ces colonnes, mais j'ai besoin d'être en mesure de retourner une valeur de la colonne à la fois. Donc, si j'ai besoin de la colonne g, je pourrais faire quelque chose comme

SELECT a, arr[5] FROM t;

Aurais-je économiser de l'espace avec l'option matrice? Y aurait-il une pénalité sur la vitesse?

D'autres idées?

  • Je pense que Erwin réponse est plus approprié de réponse ici pour la accepté de répondre.
InformationsquelleAutor punkish | 2010-06-03