文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

配置Ustore

Ustore存储引擎,又名In-place Update存储引擎(原地更新),是MogDB新增的一种存储模式。此前的版本使用的行存储引擎是Append Update(追加更新)模式。追加更新对于业务中的增、删以及HOT(HeapOnly Tuple)Update(即同一页面内更新)有很好的表现,但对于跨数据页面的非HOT UPDATE场景,垃圾回收不够高效。因此,Ustore存储引擎应运而生。

设计原理

Ustore存储引擎将最新版本的“有效数据”和历史版本的“垃圾数据”分离存储。将最新版本的“有效数据”存储在数据页面上,并单独开辟一段UNDO空间,用于统一管理历史版本的“垃圾数据”,因此数据空间不会由于频繁更新而膨胀,“垃圾数据”集中回收效率更高。

Ustore存储引擎采用NUMA-aware的UNDO子系统设计,使得UNDO子系统可以在多核平台上有效扩展;同时采用多版本索引技术,解决索引清理问题,有效提升了存储空间的回收复用效率。

Ustore存储引擎结合UNDO空间,可以实现更高效、更全面的闪回查询和回收站机制,能快速回退人为“误操作”,为MogDB提供了更丰富的企业级功能。

核心优势

  • 高性能: 对插入、更新、删除等不同负载的业务,性能以及资源使用表现相对均衡。更新操作采用原地更新模式在频繁更新类的业务场景下可拥有更高、更平稳的性能表现。适应“短”(事务短)、“频”(更新操作频繁)、“快”(性能要求高)的典型OLTP类业务场景。
  • 高效存储: 支持最大限度的原位更新, 极大节约了空间;将回滚段、数据页面分离存储,具备更高效、平稳的IO使用能力,UNDO子系统采用NUMA-aware设计,具有更好的多核扩展性,UNDO空间统一分配,集中回收,复用效率更高,存储空间使用更加高效、平稳。
  • 细粒度资源控制: Ustore引擎提供多维度的事务“监管”方式,可基于事务运行时长、单事务使用UNDO空间大小、以及整体UNDO空间限制等方式对事务运行进行“监管”,防止异常、非预期内的行为出现,方便数据库管理员对数据库系统资源使用进行规范和约束。

Ustore存储引擎可以在数据频繁更新场景下性能依旧稳如泰山,使业务系统运行更加平稳,适应更多业务场景和工作负载,特别是对性能和稳定性有更高要求的金融核心业务场景。

Ustore和Astore性能对比

Ustore的核心优势场景为频繁更新场景,相较于Astore空间利用更加紧凑,且高效的空间利用效率有效解决了频繁更新场景下的表空间膨胀造成性能下降的问题。

  • 非主键的范围更新

    在非主键的范围更新下,Ustore展示出相较于Astore更大的优势,不同并发数下的平均性能提升在**40%**以上,且随着不断地更新操作,Astore出现了表空间膨胀,而Ustore的空间趋于平稳。

  • 点查询+点更新(index scan + 非主键更新)

    在2:8读写混合情景下,100并发下Ustore低于Astore 5.36%,200并发下Ustore高出Astore 12.37%;其余情况下二者有好有坏,相差不超过5%。总体来说, Ustore在高并发、点更新更多的情况下表现更好。

  • 点查询+范围更新(index scan + 非主键更新)

    所有读写混合场景下,Ustore引擎都优于Astore引擎,尤其是在200并发、范围更新更多的情况下Ustore表现更好,具体如下:

    • 1:1读写混合情景下,100并发下Ustore高出37.8%,200并发下高出103.5%,300并发下高出78.4%;
    • 2:8读写混合情景下,100并发下Ustore高出47.5%,200并发下高出101.2%,300并发下高出76.7%;
    • 8:2读写混合情景下,100并发下Ustore高出36.8%,200并发下高出65.8%,300并发下高出59.3%。
  • 范围查询+范围更新(index scan + 非主键更新)

    所有读写混合场景下,Ustore引擎都优于Astore引擎,其中在200并发、范围更新更多的情况下Ustore表现更好。具体如下:

    • 1:1读写混合情景下,100并发下Ustore高出42.6%,200并发下高出106.1%,300并发下高出94.2%;
    • 2:8读写混合情景下,100并发下Ustore高出48.4%,200并发下高出100.2%,300并发下高出95.9%;
    • 8:2读写混合情景下,100并发下Ustore高出31.3%,200并发下高出69.7%,300并发下高出69.1%。

特性规格

Ustore存储引擎当前已支持的特性如下所示,其他特性支持情况概览见表1。

  1. Ubtree索引

  2. 向量化执行

  3. 分区表

  4. 自适应空间管理

  5. Bitmap heap scan

  6. Bitmap index scan

表1 Ustore详细特性规格

特性/功能描述 支持情况
Vacuum 支持
原地更新 支持
Hash index 不支持
Gin index 不支持
Gist index 不支持
Postgis 不支持
BRIN索引 不支持
Concurrent reindex 不支持
bitmap index scan 支持
bitmap heap scan 支持
索引列为jsonb类型 不支持
Ubtree 支持
Select显示xmax、cmin、cmax 不支持
Select显示xmin 支持
Select * for key share和for no key update 不支持
Select * for share和update 支持
段页式(segment)存储 不支持
global temp table(全局临时表) 不支持
materialized view(物化视图) 不支持
DEFERRABLE以及INITIALLY DEFERRED约束 不支持
Delete语句中与其他存储类型表一起使用
示例:
delete from col_rep_tb2 using hash_tb1 where col_rep_tb2.a=hash_tb1.b and col_rep_tb2.c>2;
col_pre_tb2是列存储方式、hash_tb1是ustore
不支持
与其他存储类型表混用 支持
闪回(闪回查询、闪回drop、闪回truncate) 不支持
bloom filter(布隆过滤器) 支持
分区表 支持
并行查询(SMP) 不支持
行级压缩 不支持
PageInspect 不支持
Wal2json 不支持
Resetxlog 不支持
Uheap的VM能力 不支持

使用指导

USTORE与原有的ASTORE(Append Update)存储引擎并存。USTORE存储引擎屏蔽了存储层实现的细节,SQL语法和原有的ASTORE存储引擎使用基本保持一致,唯一差别是建表和建索引有些细微区别。部分功能Ustore不支持,详见特性规格章节。

  • 创建表的方式

    创建Ustore表时必须开启GUC配置中的track_countstrack_activities参数(默认为开启),否则会引起空间膨胀。因为Ustore采用自适应的空间清理与回收机制,依赖于对系统空间的分析统计情况,track_counts和track_activities参数负责收集数据库系统运行中的统计数据。

    • 创建方式1:创建表时指定存储引擎类型

      开启enable_ustore参数,并重启数据库,然后通过以下语句建表。

      create table test(id int, age int, name varchar(10)) with (storage_type=ustore);
    • 创建方式2:GUC参数配置指定USTORE存储引擎

      1. 数据库启动之前,在postgresql.conf中设置“enable_default_ustore_table=on”,默认指定用户创建表时使用USTORE存储引擎。

        [postgresql.conf配置]

        enable_default_ustore_table=on
      2. 创建表。

        create table test(id int, age int, name varchar(10));
  • 创建索引的方式

    USTORE存储引擎使用的索引为UBtree, UBtree是专门给USTORE存储引擎开发的索引,也是该引擎目前唯一支持的索引类型。

    假定有如下test表结构,计划在test表的age列上增加一个UBtree索引。

    MogDB=# \d+  test
                             Table "public.test"
     Column |  Type                 | Modifiers | Storage  | Stats target | About MogDB
    --------+-----------------------+-----------+----------+--------------+-------------
     id     | integer               |           | plain    |              |
     age    | integer               |           | plain    |              |
     name   | character varying(10) |           | extended |              |
    • 创建方式1:不指定创建索引类型,默认创建UBtree索引

      MogDB=# create index ubt_idx on test(age);
      MogDB=# \d+  test
                                      Table "public.test"
       Column |  Type                 | Modifiers | Storage  | Stats target | About MogDB
      --------+-----------------------+-----------+----------+--------------+-------------
       id     | integer               |           | plain    |              |
       age    | integer               |           | plain    |              |
       name   | character varying(10) |           | extended |              |
      Indexes:
          "ubt_idx" ubtree (age) WITH (storage_type=USTORE) TBALESPACE pg_default
      Has OIDs: no
      Options: orientation=row, storage_type=ustore, compression=no
    • 创建方式2:创建索引时使用using关键字指定索引类型为“ubtree”

      MogDB=# create index ubt_idx on test using ubtree(age);
      MogDB=# \d+  test
                                      Table "public.test"
       Column |  Type                 | Modifiers | Storage  | Stats target | About MogDB
      --------+-----------------------+-----------+----------+--------------+-------------
       id     | integer               |           | plain    |              |
       age    | integer               |           | plain    |              |
       name   | character varying(10) |           | extended |              |
      Indexes:
          "ubt_idx" ubtree (age) WITH (storage_type=USTORE) TBALESPACE pg_default
      Has OIDs: no
      Options: orientation=row, storage_type=ustore, compression=no
Copyright © 2011-2024 www.enmotech.com All rights reserved.