Ron*_*ohn 2 postgresql performance index compression postgresql-performance
v8.4 和 v9.2(是的,我知道它们过时且不受支持,但我对此无能为力。)
我管理(但未设计)的数据库中的某些表在 CHARACTER VARYING(256) 字段上具有 btree 索引。即使字段值不全为空,其中的数据长度也不超过 12 个字符。
是的,这些列的物理表存储是高度压缩的,但是 btree 索引呢?如果将列更改为 VARCHAR(12),索引会更有效吗?
谢谢
“如果将列更改为 VARCHAR(12),索引会更有效吗?”
不,这很容易测试:
Run Code Online (Sandbox Code Playgroud)create table foo(val1 varchar(256), val2 varchar(12)); create index i_foo1 on foo(val1); create index i_foo2 on foo(val2);
Run Code Online (Sandbox Code Playgroud)insert into foo(val1,val2) select 'ABCDEFGHIJ','ABCDEFGHIJ' from generate_series(1,10000);
Run Code Online (Sandbox Code Playgroud)vacuum full;
Run Code Online (Sandbox Code Playgroud)select relname, pg_size_pretty(pg_relation_size(c.oid)) from pg_class c join pg_namespace n on n.oid = c.relnamespace where nspname like 'fiddle%';姓名 | pg_size_pretty :------ | :------------- 富| 512 KB i_foo1 | 392 KB i_foo2 | 392 KB
dbfiddle在这里
“是的,这些列的物理表存储是高度压缩的……”
它没有被压缩(除非字符串很长),只是因为varchar(与 不同char)长度说明符只是一个决定最大长度的约束: