Postgresql

PostgreSQL 是否有任何字元串壓縮選項?

  • May 27, 2018

我有一張這樣的桌子:

CREATE TABLE BLOG(
  CATEGORY CHAR(32)
);

類別是一列,其中儲存了列舉值。

例如,我有 100 萬行和 10 個類別的唯一值。

讓我們用範例數據填充表格:

CREATE TABLE TMP_STRINGS(
  id SERIAL PRIMARY KEY,
  CATEGORY CHAR(50)
);

insert into TMP_STRINGS values (1, 'category1'), (2, 'category2'), (3, 'category3'), (4, 'category4'), (5, 'category5'), (6, 'category6'), (7, 'category7'), (8, 'category8'), (9, 'category9');

insert into blog(category)
SELECT category FROM (SELECT floor(random() * 9 + 1)::int as n from generate_series(1,1000000)) AS T INNER JOIN tmp_strings ON T.n = tmp_strings.id;

該數據庫為42 MB

SELECT pg_size_pretty(pg_total_relation_size('"blog"'));

一行數據庫是44 字節

SELECT octet_length(t.*::text) FROM blog AS t WHERE category='category1' LIMIT 1;

類別可以用smallint編碼,例如:

category1 -- 1
category2 -- 2
category3 -- 3
category4 -- 4
category5 -- 5
category6 -- 6
category7 -- 7
category8 -- 8
category9 -- 9

有沒有辦法自動做到這一點?我的意思是String interning (String pooling)的一些選項或模組。

如果您想要像儲存為整數的字元串使用列舉類型的效果,則與表互動的 SQL 語法將是相同的,除非您需要在新列上執行字元串操作;

CREATE TYPE example_category AS ENUM (
'category1', 'category2', 'category3', 'category4', 'category5',
'category6', 'category7', 'category8', 'category9');

ALTER TABLE tmp_strings ALTER COLUMN category 
 TYPE example_category USING category::example_category;

我認為列舉使用 4 個字節(可能是 5 個?)

引用自:https://dba.stackexchange.com/questions/207944