数据仓库服务 GAUSSDB(DWS)-数据库SEQUENCE优秀实践:sequence相关的典型优化场景

时间:2024-09-14 17:38:49

sequence相关的典型优化场景

业务场景:

某业务场景中使用 CDM 数据同步工具进行数据迁移,从源端入库目标端 GaussDB (DWS)。导入速率与经验值相差较大,业务将CDM并发从1调整为5,同步速率仍无法提升。查看语句执行情况,除COPY入库外,其余业务均正常执行,无性能瓶颈,且观察无资源瓶颈,因此初步判断为该业务自身存在瓶颈,查看该表COPY相关的作业等待视图情况:

如上图所示,由于CDM作业执行了5个并发,因此在活跃视图中可以看到5个COPY语句,根据这5个COPY语句对应的query_id查看等待视图情况。查看到这5个COPY中,同一时刻,仅有1个COPY在向GTM申请序列值,其余的COPY在等待轻量级锁。因此,即使作业中开启了5并发在运行,实际效果较1并发并没有带来明显提升。

问题原因:

目标表在建表时使用了serial类型,默认创建的sequence的cache为1,导致在并发COPY入库时,CN频繁与GTM建连,且多个并发之间存在轻量锁争抢,导致数据同步效率低。

解决方案:

此种场景下可以调大sequence的cache值,防止频繁GTM建联带来的瓶颈。本业务场景示例中,业务每次同步的数据量在10万左右,根据业务评估,将cache值修改为10000(实际使用时应根据业务设置合理的cache值,既能保证快速访问,又不会造成序列号浪费)。

8.2.1.100及以上集群版本中支持使用ALTER SEQUENCE的方式修改cache值。

8.2.1及之前低版本集群中GaussDB(DWS)不支持通过ALTER SEQUENCE的方式修改cache值,可以通过如下方式修改已有sequence的cache值,以mytable表为例:

  1. 解除当前sequence与目标表的关联关系

    1
    2
    ALTER SEQUENCE mytable_b_seq owned by none;
    ALTER TABLE mytable alter b drop default;
    

  2. 记录当前sequence值,作为新建sequence的start value。

    1
    SELECT nextval('mytable_b_seq');
    

    删除sequence。

    1
    DROP SEQUENCE mytable_b_seq;
    

  3. 新建sequence并绑定目标表,xxx替换为上一步查到的nextval值。

    1
    2
    3
    CREATE SEQUENCE mytable_b_seq START with xxx cache 10000 owned by mytable.b;
    ALTER SEQUENCE mytable_b_seq owner to u1;--u1为mytable表的属主,如果当前用户即为属主,可不执行此语句。
    ALTER TABLE mytable alter b set default nextval('mytable_b_seq');
    

support.huaweicloud.com/bestpractice-dws/dws_05_0113.html