Postgres btree 索引键是否被压缩?

Ron*_*ohn 2 postgresql performance index compression postgresql-performance

v8.4 和 v9.2(是的,我知道它们过时且不受支持,但我对此无能为力。)

我管理(但未设计)的数据库中的某些表在 CHARACTER VARYING(256) 字段上具有 btree 索引。即使字段值不全为空,其中的数据长度也不超过 12 个字符。

是的,这些列的物理存储是高度压缩的,但是 btree 索引呢?如果将列更改为 VARCHAR(12),索引会更有效吗?

谢谢

Jac*_*las 5

“如果将列更改为 VARCHAR(12),索引会更有效吗?”

不,这很容易测试:

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%';
Run Code Online (Sandbox Code Playgroud)
姓名 | pg_size_pretty
:------ | :-------------
富| 512 KB        
i_foo1 | 392 KB        
i_foo2 | 392 KB        

dbfiddle在这里

“是的,这些列的物理表存储是高度压缩的……”

它没有被压缩(除非字符串很长),只是因为varchar(与 不同char)长度说明符只是一个决定最大长度的约束:

短字符串(最多 126 个字节)的存储要求是 1 个字节加上实际字符串,其中包括字符情况下的空格填充。较长的字符串有 4 个字节的开销,而不是 1 个。系统会自动压缩长字符串,因此对磁盘的物理要求可能会更少。