文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

In-place Update存储引擎Ustore

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

设计原理

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

Ustore存储引擎采用NUMA-aware的UNDO子系统设计,使得UNDO子系统可以在多核平台上有效扩展;采用多版本索引技术,在Index Only Scan场景下的查询性能相比Astore得到了显著提升(2~5倍),另外还解决了索引清理问题,有效提升了存 储空间的回收复用效率。

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

核心优势

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

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

Ustore和Astore性能对比

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

  • 非主键的范围更新

    img1

    图 1 不同并发数下非主键范围更新,Astore 和 Ustore 的tps对比

    img2

    图 2 30并发数下非主键范围更新,Astore 和 Ustore 的数据库大小对比

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

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

    img3

    图 3 100并发数下点查询+点更新,2:8读写混合测试tps

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

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

    img4

    图 4 不同并发数下点查询+范围更新,1:1读写混合测试tps

    img5

    图 5 不同并发数下点查询+范围更新,2:8读写混合测试tps

    img6

    图 6 不同并发数下点查询+范围更新,8:2读写混合测试tps

    所有读写混合场景下,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 + 非主键更新)

    img7

    图 7 不同并发数下范围更新+范围查询,1:1读写混合测试tps

    img8

    图 8 不同并发数下范围更新+范围查询,2:8读写混合测试tps

    img9

    图 9 不同并发数下范围更新+范围查询,8:2读写混合测试tps

    所有读写混合场景下,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%。

特性增强

SMP并行查询能力

Ustore存储引擎的SMP并行能力涵盖以下几种场景:

  • 并行顺序扫描(Parallel Seq Scan)

    img10

    图10 Ustore seq scan并行性能

    开启并行后,随着并行度的增加,Seq scan顺序查询的性能随着并行度的增加而提升,其中在Agg场景下表现最佳,并行度16的情况下,查询性能相比串行快了12~13倍。

  • 并行索引扫描(Parallel Index Scan)

    img11

    图11 Ustore index scan并行性能

    开启并行后,在合适的场景下,Index Scan查询性能随着并行度的增加而提升,其中在Agg场景下表现最佳, 并行度16的情况下,并行比串行快了11-15倍。

  • 并行仅索引扫描(Parallel Index Only Scan)

    img12

    图12 Ustore index only scan并行性能

    开启并行后,在合适的场景下,Index Only Scan查询性能随着并行度的增加而提升,其中在Agg场景下表现最佳,并行度16的情况下,并行比串行快了5-13倍;且Ustore的Index Only Scan算子在串行与并行场景下均优于Astore。

  • 并行位图扫描 (Parallel Bitmap Scan)

    位图读取针对随机读,且数据量较大的场景会有较好的表现,并行度16的情况下,BitmapScan算子性能有70%-100%的性能提升,但端到端性能提升不明显,尤其在数据量较小的情况下。

顺序扫描预读

顺序扫描预读机制将顺序扫描的CPU处理过程与I/O操作并行化,尽量避免CPU因为等待I/O而阻塞。不同并行度下针对Ustore表的预读性能结果如下:

  • 主节点tpch测试

    dop=1:总体算子提升为41%,端到端的提升为19%

    img13

    dop=4:总体算子提升为43%,端到端的提升为21%

    img14

    dop=8:总体算子提升为45%,端到端的提升为23%

    img15

    dop=16:总体算子提升为37%,端到端的提升为13%

    img16

  • 混合负载(tpcc+tpch)的情况下性能提升的结果和对TPMC的影响

    dop=1 : 总体算子提升为32%,端到端的提升为19%,tpmc效果提升3%,tpmc不受预读影响

    img17

    dop=4 : 总体算子提升为38%,端到端的提升为22%,tpmc效果提升2%,tpmc不受预读影响

    img18

特性规格

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

  1. Ubtree索引

  2. 向量化执行

  3. 分区表

  4. 自适应空间管理

  5. SMP并行查询

  6. 顺序扫描预读

  7. Bitmap heap scan

  8. 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

相关特性

Ustore SMP并行扫描顺序扫描预读

Copyright © 2011-2024 www.enmotech.com All rights reserved.