您的位置 首页 > 德语词汇

sequence是什么意思(今儿给你讲的透透的)

各位老铁们好,相信很多人对sequence是什么意思都不是特别的了解,因此呢,今天就来为大家分享下关于sequence是什么意思以及今儿给你讲的透透的的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

sequence是什么意思(今儿给你讲的透透的)

本文分享自华为云社区《GaussDB(DWS)关于sequence的那些事》,作者:Arrow0lf。原文详情戳→https://bbs.huaweicloud.com/blogs/393731#H13?utm_source=jinritoutiao&utm_medium=bbs-ex&utm_campaign=ei&utm_content=content

sequence,也称作序列,是用来产生唯一整数的数据库对象。序列的值按照一定的规则自增/自减,一般常被用作主键。GaussDB(DWS)中,创建sequence时会同时创建一张同名的元数据表,用来记录sequence相关的信息,例如:

postgres=#createsequenceseq;\nCREATESEQUENCE\npostgres=#select*fromseq;\nsequence_name|last_value|start_value|increment_by|max_value|min_value|cache_value|log_cnt|is_cycled|is_called|uuid\n---------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------+---------\nseq|-1|1|1|9223372036854775807|1|1|0|f|f|1600007\n(1row)

其中,sequence_name表示sequence的名字,last_value当前无意义,start_value表示sequence的初始值,increment_by表示sequence的步长,max_value表示sequence的最大值,min_value表示最小值,cache_value表示为了快速获取下一个序列值而预先存储的sequence值个数(定义cache后不能保证sequence值的连续性,会产生空洞,详见下文)。log_cnt表示WAL日志记录的sequence值个数,由于在DWS中sequence是从GTM获取和管理,因此log_cnt无实际意义;is_cycled表示sequence在达到最小或最大值后是否循环继续,is_called表示该sequence是否已被调用(仅表示在当前实例是否被调用,例如在cn_5001上调用之后,cn_5001上该原数据表的值变为t,cn_5002上该字段仍为f),uuid代表该sequence的唯一标识。

GaussDB(DWS)中,通过GTM(GlobalTransactionManager,名为全局事务管理器)负责生成和维护全局事务ID、事务快照、Sequence等需要全局唯一的信息。sequence在DWS中的创建流程如下图所示:

因此,sequence的维护和申请实际是在GTM上完成的。当申请nextval,每个执行nextval调用的实例会根据该sequence的uuid到GTM上申请序列值,每次申请的序列值范围与cache有关,只有当cache消耗完之后才会继续到GTM上申请。因此,增大sequence的cache有利于减少CN/DN与GTM通信的次数。接下来,将详细介绍sequence在DWS中的使用场景和注意事项。

GaussDB(DWS)中,有两种创建sequence的方法:

方法一:直接创建sequence,并通过nextval调用,举例:

postgres=#createsequenceseq;\nCREATESEQUENCE\npostgres=#insertintot_destselectnextval('seq'),*fromt_src;\nINSERT00

方法二:建表时使用serial类型,会自动创建一个sequence,并且会将该列的默认值设置为nextval,举例:

postgres=#createtabletest(aint,bserial)distributebyhash(a);\nNOTICE:CREATETABLEwillcreateimplicitsequence"test_b_seq"forserialcolumn"test.b"\nCREATETABLE\npostgres=#\\d+test\nTable"public.test"\nColumn|Type|Modifiers|Storage|Statstarget|Description\n--------+---------+--------------------------------------------------+---------+--------------+-------------\na|integer||plain||\nb|integer|notnulldefaultnextval('test_b_seq'::regclass)|plain||\nHasOIDs:no\nDistributeBy:HASH(a)\nLocationNodes:ALLDATANODES\nOptions:orientation=row,compression=no

本例中,会自动创建一个名为test_b_seq的sequence。其实严格来讲,serial类型是一个“伪类型”,本质上,serial其实是int类型,只不过在创建时会同时创建一个sequence,并与该列相关联,本质上,方法二中的例子与下面的写法等价:

postgres=#createtabletest(aint,bint)distributebyhash(a);\nCREATETABLE\npostgres=#createsequencetest_b_seqownedbytest.b;\nCREATESEQUENCE\npostgres=#altersequencetest_b_seqownertojerry;--jerry为test表的属主,如果当前用户即为属主,可不执行此语句\nALTERSEQUENCE\npostgres=#altertabletestalterbsetdefaultnextval('test_b_seq'),alterbsetnotnull;\nALTERTABLE\npostgres=#\\d+test\nTable"public.test"\nColumn|Type|Modifiers|Storage|Statstarget|Description\n--------+---------+--------------------------------------------------+---------+--------------+-------------\na|integer||plain||\nb|integer|notnulldefaultnextval('test_b_seq'::regclass)|plain||\nHasOIDs:no\nDistributeBy:HASH(a)\nLocationNodes:ALLDATANODES\nOptions:orientation=row,compression=nosequence在业务中的常见用法

sequence在业务中常被用作在导入时生成主键或唯一列,常见于数据迁移场景。不同的迁移工具或业务导入场景使用的入库方法不同,常见的方法主要可以分为copyinsert。对于seqeunce来讲,这两种场景在处理时略有差别。

场景一:insert下推场景

postgres=#createtabletest1(aint,bserial)distributebyhash(a);\nNOTICE:CREATETABLEwillcreateimplicitsequence"test1_b_seq"forserialcolumn"test1.b"\nCREATETABLE\npostgres=#\npostgres=#createtabletest2(aint)distributebyhash(a);\nCREATETABLE\npostgres=#\npostgres=#\npostgres=#explainverboseinsertintotest1(a)selectafromtest2;\nQUERYPLAN\n------------------------------------------------------------------------------------------------\nid|operation|E-rows|E-distinct|E-memory|E-width|E-costs\n----+------------------------------------+--------+------------+----------+---------+---------\n1|->Streaming(type:GATHER)|1|||4|18.41\n2|->Insertonpublic.test1|40|||4|18.25\n3|->SeqScanonpublic.test2|40||1MB|4|16.24\n\nTargetlistInformation(identifiedbyplanid)\n---------------------------------------------------------\n1--Streaming(type:GATHER)\nNode/s:Alldatanodes\n3--SeqScanonpublic.test2\nOutput:test2.a,nextval('test1_b_seq'::regclass)\nDistributeKey:test2.a\n\n======QuerySummary=====\n-------------------------------\nSystemavailablemem:4669440KB\nQueryMaxmem:4669440KB\nQueryestimatedmem:1024KB\nParserruntime:0.045ms\nPlannerruntime:12.622ms\nUniqueSQLId:972921662\n(22rows)

由于在nextval在insert场景下可以下推到DN执行,因此,不管是使用default值的nextval,还是显示调用nextval,nextval都会被下推到DN执行,在上例的执行计划中也能看出,nextval的调用在sequence层,说明是在DN执行的。此时,DN直接向GTM申请序列值,且各DN并行执行,因此效率相对较高。

场景二:copy场景

在业务开发过程中,入库方式除了insert外,还有copy入库的场景。此类场景多见于将文件内容copy入库、使用CopyManager接口入库等,此外,CDM数据同步工具,其实现方式也是通过copy的方式批量入库。在copy入库过程中,如果copy的目标表使用了默认值,且默认值为nextval,处理过程如下:

此场景下,由CN负责向GTM申请序列值,因此,当sequence的cache值较小,CN会频繁和GTM建联并申请nextval,出现性能瓶颈。下面,将针对此种场景说明业务上的性能表现和优化方法。

业务场景:某业务场景使用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值,既能保证快速访问,又不会造成序列号浪费)。

当前GaussDB(DWS)不支持通过altersequence的方式修改cache值,那么如何修改已有sequence的cache值呢?已第二节中方法二的test表为例,可以通过如下方式达到修改cache的目的:

--解除当前sequence与目标表的关联关系\naltersequencetest_b_seqownedbynone;\naltertabletestalterbdropdefault;\n--记录当前的seqeunce值并删除sequence\nselectnextval('test_b_seq');--记录该值,作为新建sequence的startvalue\ndropsequencetest_b_seq;\n--新建seqeunce并绑定目标表\ncreatesequencetest_b_seqSTARTwithxxxcache10000ownedbyt.b;--xxx替换为上一步查到的nextval\naltersequencetest_b_seqownertojerry;--jerry为test表的属主,如果当前用户即为属主,可不执行此语句\naltertabletestalterbsetdefaultnextval('test_b_seq'),alterbsetnotnull;

关注#华为云开发者联盟#\u0002,第一时间了解华为云新鲜技术~

如果你还想了解更多这方面的信息,记得收藏关注本站。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023