如何提高PostgreSQL存储大量重复字符串的存储效率?

use*_*603 5 postgresql optimization storage

细读一下这个:

CREATE TABLE test
(
    id      bigserial,
    timestamp   timestamptz NOT NULL DEFAULT now(),
    "a text column" text NOT NULL,
    PRIMARY KEY (id)
);

INSERT INTO test ("a text column") VALUES ('This is a text.');
INSERT INTO test ("a text column") VALUES ('This is a text.');
INSERT INTO test ("a text column") VALUES ('This is a text.');
Run Code Online (Sandbox Code Playgroud)

PostgreSQL 似乎存储“这是一段文本”。三次单独的时间,而不是一次,并通过内部自动参考重复的次数。这意味着我的表在短短几个小时内就变得巨大,即使它一遍又一遍地只保存相同的几个字符串......我自然希望它只存储每个字符串一次,坦率地说,我仍然以某种方式期望每次都会这样时间,但如果没有,我会感到惊讶。

可以用我现有的知识做到这一点(并且已经做过很多次):

CREATE TABLE test
(
    id      bigserial,
    timestamp   timestamptz NOT NULL DEFAULT now(),
    helperid    bigint,
    PRIMARY KEY (id)
);

CREATE TABLE "test helper"
(
    id      bigserial,
    "a text column" text NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (helperid) REFERENCES test (id)
);
Run Code Online (Sandbox Code Playgroud)

但是,我现在需要在插入每条记录之前编写一个愚蠢的检查,以确保它不在“测试助手”表中。基本上,我可以让它工作,但这是一项繁重的工作,烦人,令人筋疲力尽,而且我得到了另一个愚蠢的表,它堵塞了命名空间,并且在我的表列表中通常看起来很丑陋。

这感觉像是一个常见问题,几乎和非常好的bigserial机制一样常见,那么为什么没有这样的功能呢?或者有吗?我可以做这样的事情吗?

CREATE TABLE test
(
    id      bigserial,
    timestamp   timestamptz NOT NULL DEFAULT now(),
    "a text column" smartstoragetext NOT NULL,
    PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)

通常,一个表会有多个文本列,其中有很多重复/通用值。为每个这样的列制作一个“辅助表”感觉很愚蠢。这真的不可能是“你如何做到这一点”......

简单地使文本列成为索引是没有帮助的,除非我完全误解了索引是什么。也许是一种特殊索引?只要它是内置的,我就洗耳恭听。