PG13
:
btree
索引去重
正文
PG13
一个重要的特性就是
Btree
索引去重。使得物理文件大小更小,减小
IO
,帮助
提升
select
性能。
GIN
索引,如果不 同行的索引键 相同,那么会 存储一个索引 条目。指向多 条行
(
tuple IDs
)的指针存储到行记录的
posting list
中。
B-tree
相反,需要对于每条行记
录都存储一 条索引记录。 这样有利于维 护但是导致很 多重复的索引 记录。
Commit
0d86bbb70
引入了
B-tree
索引去重。只在索引页分裂的时候去重。这些额外的工作被减
少页分裂次数和索引大小平衡掉。
不会影响唯一索引?
每次
update
都会创建一个新的行,每个行版本都需要被索引。因此一个唯一索引也
会包含相同索引记录多次。如果
update
频繁时,也会减小唯一索引膨胀。
优点
减小索引空间大小,帮助节省磁盘空间。更重的是尽可能在
RAM
中缓存索引,使得
扫描索引更快并减小索引膨胀。
升级注意事项
通过
pg_upgrade
升级,需要执行
REDINDEX
。通过
pg_dumpall
及
restore
或使
用逻辑复制重建索引时,自动去重。
设置
deduplicate_items = of
,使用老的行为。
测试
CREATE TABLE rel (
aid bigint NOT NULL,
bid bigint NOT NULL
);
ALTER TABLE rel
ADD CONSTRAINT rel_pkey PRIMARY KEY (aid, bid);
CREATE INDEX rel_bid_idx ON rel (bid);
INSERT INTO rel (aid, bid)
SELECT i, i / 10000
FROM generate_series(1, 20000000) AS i;
/* set hint bits and calculate statistics */
VACUUM (ANALYZE) rel;
这里关注索引
rel_bid_idx
,查看
REINDEX
前后的大小。最后执行多次:
DO $$BEGIN
评论