PG13 B-tree索引去重
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,使用老的行为。
测试
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
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/
- 上传文件的陷阱
- BZOJ4872: [Shoi2017]分手是祝愿
- JSONP挖掘与高级利用
- CTF---隐写术入门第二题 小苹果
- 隐含层权重参数的初始化方式的对比实验
- BZOJ4868: [Shoi2017]期末考试
- namespace用法
- 全站缓存时代
- 洛谷P1962 斐波那契数列(矩阵快速幂)
- 负载均衡https转发会让服务器误判
- 凯撒加密之一个神奇的Python的API
- 10分钟搞懂TensorBoard用法
- 【最新TensorFlow1.4.0教程02】利用Eager Execution 自定义操作和梯度 (可在 GPU 运行)
- 清北集训Day1T3 LYK loves jumping(期望DP)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【编译技术】:解读 Babel AST Format——02
- PyTorch入门笔记-PyTorch初见
- ssh 连接 Linux 服务器并安装 Anaconda
- Ant Design Vue 报错:Failed to resolve directive: ant-portal的解决办法
- 小程序生成二维码海报的组件-wxa-plugin-canvas
- kbone 是什么?这可能是最好的小程序开源框架
- jQuery根据填写的input的数值导出excel表格
- 小程序根据返回值英文渲染出对应的中文
- redis灵魂拷问:聊一聊AOF日志重写
- 小程序返回的时间戳转化成时间
- JSP 报错:ReferenceError: $ is not defined
- 小程序使用 组件库 vant-weapp详细教程
- DEBUG=1 宏定义对 @weakify 和 @strongify 的影响分析
- 为什么 demangle 会失败?
- js使用webgl