Postgresql
PostgreSQL 是否有任何字元串壓縮選項?
我有一張這樣的桌子:
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 個?)