前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PG13 B-tree索引去重

PG13 B-tree索引去重

作者头像
yzsDBA
发布2020-10-28 10:23:27
4310
发布2020-10-28 10:23:27
举报
文章被收录于专栏:PostgreSQL研究与原理解析

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 = off,使用老的行为。

测试

代码语言:javascript
复制
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前后的大小。最后执行多次:

代码语言:javascript
复制
DO $$BEGIN
   PERFORM * FROM rel WHERE bid < 100::bigint;
END;$$;

执行索引扫描,打开\timing查看执行时间。比较PG12和PG13以及GIN索引。

测试结果

PG13

PG12

PG12 GIN

大小

126MB

408MB

51MB

REINDEX后大小

133MB

429MB

47MB

查询时间

130ms

130ms

140ms

结论

测试结果显示,PG13的索引大小是PG12的1/3左右,仍比GIN索引大。测试中观察到去重后的索引查询时间执行差异更大,这个目前无法解释。

这个特性是B-tree索引的一大进步。

原文

https://www.cybertec-postgresql.com/en/b-tree-index-deduplication/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yanzongshuaiDBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PG13:btree索引去重
    • 正文
      • 原文
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档