PG13 B-tree索引去重

简介: 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/

    目录
    相关文章
    |
    5月前
    |
    关系型数据库 MySQL 索引
    【MySQL 解析】Hash索引和B+树索引对比分析
    【1月更文挑战第11天】【MySQL 解析】Hash索引和B+树索引对比分析
    |
    4月前
    |
    存储 关系型数据库 MySQL
    MySQL数据库——索引(2)-B+Tree、Hash结构,索引分类(聚集索引、二级索引)
    MySQL数据库——索引(2)-B+Tree、Hash结构,索引分类(聚集索引、二级索引)
    54 1
    |
    3月前
    |
    存储 关系型数据库 MySQL
    第8章 索引index
    第8章 索引index
    26 0
    |
    存储 算法 数据可视化
    MySQL数据库 -- 索引结构 (B+ tree 与 Hash)
    索引(index)是帮助MySQL高效获取数据的数据结构 , 在Mysql中有两个最常用的索引 -- B+tree索引 和 Hash索引 B-Tree(B树)是一种多叉路平衡查找树,相对于二叉树,B树每个节点可以有多个分支 哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中
    171 0
    |
    存储 数据库 索引
    解析B+Tree索引在H2中的实现
    提到数据库索引的时候,一般都会提到 B+Tree,因为主流数据库都使用它。我们的DawnSql使用的是 H2 中的存储引擎,因此也是使用 B+Tree。这篇文章的目的是帮助读者更快的掌握 B+Tree 在存储引擎中的作用,以及具体的实现。
    解析B+Tree索引在H2中的实现
    |
    算法 关系型数据库 MySQL
    MySQL - 索引方法 BTree 索引和 Hash 索引的区别
    MySQL - 索引方法 BTree 索引和 Hash 索引的区别
    154 0
    |
    关系型数据库 定位技术 数据库
    【DB吐槽大会】第50期 - PG GiST距离排序操作符和过滤无法同时使用索引
    大家好,这里是DB吐槽大会,第50期 - PG GiST距离排序操作符和过滤无法同时使用索引
    |
    弹性计算 关系型数据库 测试技术
    PostgreSQL 分区表如何支持多列唯一约束 - 枚举、hash哈希 分区, 多列唯一, insert into on conflict, update, upsert, merge insert
    标签 PostgreSQL , 分区表 , native partition , 唯一 , 非分区键唯一 , 组合唯一 , insert into on conflict , upsert , merge insert 背景 PG 11开始支持HASH分区,10的分区如果要支持hash分区,可以通过枚举绕道实现。 《PostgreSQL 9.x, 10, 11 hash分区表 用法举例
    3066 0