范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

详解数仓中sequence的应用场景及优化

  本文分享自华为云社区《GaussDB(DWS)关于sequence的那些事》,作者:Arrow0lf 。
  原文详情:https://bbs.huaweicloud.com/blogs/393731#H11?utm_source=jinritoutiao&utm_medium=bbs-ex&utm_campaign=ei&utm_content=content什么是sequence
  sequence,也称作序列,是用来产生唯一整数的数据库对象。序列的值按照一定的规则自增/自减,一般常被用作主键。GaussDB(DWS)中,创建sequence时会同时创建一张同名的元数据表,用来记录sequence相关的信息,例如:postgres=# create sequence seq; CREATE SEQUENCE postgres=# select * from seq;  sequence_name | last_value | start_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called |  uuid    ---------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------+---------  seq           |         -1 |           1 |            1 | 9223372036854775807 |         1 |           1 |       0 | f         | f         | 1600007 (1 row)
  其中,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(Global Transaction Manager,名为全局事务管理器)负责生成和维护全局事务ID、事务快照、Sequence等需要全局唯一的信息。sequence在DWS中的创建流程如下图所示:
  具体过程为:接受SQL命令的CN从GTM申请UUID;GTM返回一个UUID;CN将拿到的UUID与用户创建的sequenceName绑定;CN将绑定关系下发给其他节点上,其他节点同步创建sequence元数据表;CN将UUID 和sequence的startID发送到GTM端,在GTM行进行永久保存。
  因此,sequence的维护和申请实际是在GTM上完成的。当申请nextval,每个执行nextval调用的实例会根据该sequence的uuid到GTM上申请序列值,每次申请的序列值范围与cache有关,只有当cache消耗完之后才会继续到GTM上申请。因此,增大sequence的cache有利于减少CN/DN与GTM通信的次数。接下来,将详细介绍sequence在DWS中的使用场景和注意事项。如何创建sequence
  GaussDB(DWS)中,有两种创建sequence的方法:
  方法一:直接创建sequence,并通过nextval调用,举例:postgres=# create sequence seq; CREATE SEQUENCE postgres=# insert into t_dest select nextval("seq"),* from t_src; INSERT 0 0
  方法二:建表时使用serial类型,会自动创建一个sequence,并且会将该列的默认值设置为nextval,举例:postgres=# create table test(a int, b serial) distribute by hash(a); NOTICE:  CREATE TABLE will create implicit sequence "test_b_seq" for serial column "test.b" CREATE TABLE postgres=#d+ test                                             Table "public.test"  Column |  Type   |                    Modifiers                     | Storage | Stats target | Description  --------+---------+--------------------------------------------------+---------+--------------+-------------  a      | integer |                                                  | plain   |              |   b      | integer | not null default nextval("test_b_seq"::regclass) | plain   |              |  Has OIDs: no Distribute By: HASH(a) Location Nodes: ALL DATANODES Options: orientation=row, compression=no
  本例中,会自动创建一个名为test_b_seq的sequence。其实严格来讲,serial类型是一个"伪类型",本质上,serial其实是int类型,只不过在创建时会同时创建一个sequence,并与该列相关联,本质上,方法二中的例子与下面的写法等价:postgres=# create table test(a int, b int) distribute by hash(a); CREATE TABLE postgres=# create sequence test_b_seq owned by test.b; CREATE SEQUENCE postgres=# alter sequence test_b_seq owner to jerry;  --jerry为test表的属主,如果当前用户即为属主,可不执行此语句 ALTER SEQUENCE postgres=# alter table test alter b set default nextval("test_b_seq"), alter b set not null; ALTER TABLE postgres=# d+ test                                             Table "public.test"  Column |  Type   |                    Modifiers                     | Storage | Stats target | Description  --------+---------+--------------------------------------------------+---------+--------------+-------------  a      | integer |                                                  | plain   |              |   b      | integer | not null default nextval("test_b_seq"::regclass) | plain   |              |  Has OIDs: no Distribute By: HASH(a) Location Nodes: ALL DATANODES Options: orientation=row, compression=no sequence在业务中的常见用法
  sequence在业务中常被用作在导入时生成主键或唯一列,常见于数据迁移场景。不同的迁移工具或业务导入场景使用的入库方法不同,常见的方法主要可以分为copy和insert。对于seqeunce来讲,这两种场景在处理时略有差别。
  场景一:insert下推场景postgres=# create table test1(a int, b serial) distribute by hash(a); NOTICE:  CREATE TABLE will create implicit sequence "test1_b_seq" for serial column "test1.b" CREATE TABLE postgres=#  postgres=# create table test2(a int) distribute by hash(a); CREATE TABLE postgres=#  postgres=#  postgres=# explain verbose insert into test1(a) select a from test2;                                            QUERY PLAN                                            ------------------------------------------------------------------------------------------------   id |             operation              | E-rows | E-distinct | E-memory | E-width | E-costs   ----+------------------------------------+--------+------------+----------+---------+---------    1 | ->  Streaming (type: GATHER)       |      1 |            |          |       4 | 18.41       2 |    ->  Insert on public.test1      |     40 |            |          |       4 | 18.25       3 |       ->  Seq Scan on public.test2 |     40 |            | 1MB      |       4 | 16.24            Targetlist Information (identified by plan id)        ---------------------------------------------------------    1 --Streaming (type: GATHER)          Node/s: All datanodes    3 --Seq Scan on public.test2          Output: test2.a, nextval("test1_b_seq"::regclass)          Distribute Key: test2.a      ====== Query Summary =====     -------------------------------  System available mem: 4669440KB  Query Max mem: 4669440KB  Query estimated mem: 1024KB  Parser runtime: 0.045 ms  Planner runtime: 12.622 ms  Unique SQL Id: 972921662 (22 rows)
  由于在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,出现性能瓶颈。下面,将针对此种场景说明业务上的性能表现和优化方法。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值,既能保证快速访问,又不会造成序列号浪费)。
  当前GaussDB(DWS)不支持通过alter sequence的方式修改cache值,那么如何修改已有sequence的cache值呢?以第二节中方法二的test表为例,可以通过如下方式达到修改cache的目的:-- 解除当前sequence与目标表的关联关系 alter sequence test_b_seq owned by none; alter table test alter b drop default; -- 记录当前的seqeunce值并删除sequence select nextval("test_b_seq");   --记录该值,作为新建sequence的start value drop sequence test_b_seq; -- 新建seqeunce并绑定目标表 create sequence test_b_seq START with xxx cache 10000 owned by test.b;  -- xxx替换为上一步查到的nextval alter sequence test_b_seq owner to jerry;  --jerry为test表的属主,如果当前用户即为属主,可不执行此语句 alter table test alter b set default nextval("test_b_seq"), alter b set not null;参考链接:
  https://bbs.huaweicloud.com/blogs/180833
  https://bbs.huaweicloud.com/blogs/338904
  关注#华为云开发者联盟#,第一时间了解华为云新鲜技术~

曼联36曼城,官博被爆破C罗没上,这锅谁背?瓜迪奥拉科学养滕英超联赛第九轮,曼城主场6比3曼联!其实赛前都知道,曼联根本踢不过,实力差距很明显。瓦拉内那次受伤,一下子释放了哈兰德,角球学霸没上,哈兰德就进了,后面那个瓦拉内明显已经不太行了,仰望那抹红,烈烈在心中一抹红,跃动眼前,似烈焰熊熊,似烈日喷薄,映红每一处山河。那年,很小,跟父亲到村上,见你在风中猎猎飘扬。那长长的竹竿,因为你气宇轩昂。那陈旧的小楼,因为你焕发容光。懵懂的我,从此爱摘抄每日金句1。做人,要努力得到的不是呼风唤雨的能力,而是淡看风云的胸怀。站得高才能看得远,看得淡才能放得下。怀着一颗宽容的心去生活,再拥挤的世界也会变得无限宽广,再平凡的人生也会变得充满阳光一抹斜阳照古今,不知何处去,东风犹自弄瑶琴已难寻,一抹斜阳照古今,不知何处去,东风犹自弄瑶琴。钗头凤落有谁知,欲借东风寄相思,斜阳不解离人意,犹照沈园一地痴。吹云不见日,玉钗堕地无人拾,沈园旧事斜阳空叹息。斜阳一抹沈园看落一枚红叶醉饮秋一枚红叶醉饮秋作者清瘦的雨诵读黎敏从晨风那丝丝入扣的凉意中我已经触摸到了秋天从果实那飘来的缕缕清香里我已经嗅到了秋天其实从捡起的一枚红叶里我就一下子醉入了秋天这一片红就那样轻轻一晃君生我未生,我生君已老我是一个孤儿,也许是重男轻女的结果,也许是男欢女爱又不能负责的产物。是哲野把我拣回家的。那年他落实政策自农村回城,在车站的垃圾堆边看见了我,一个漂亮的,安静的小女婴,许多人围着,他国庆假期成都周边游推荐免费爬山徒步国庆假期马上到了,今年因为前段时间成都疫情的原因,号召大家就近游玩,特别是有娃娃上学的家庭。今天为大家整理推荐成都周边小众的爬山徒步地,不要门票,不打挤,看看你去过多少地方彭州1狮又赢了!倪老传奇续写世乒赛,一单双杀劲敌!又要奔领奖台吗?10月3日,成都世乒赛进入第四天的争夺,明天将是小组赛的最后一天,目前,中国男女团皆三战全胜稳定小组第一,锁定16强已无悬念,还有几支队伍也基本提前一天出线,比如德女队日女队等,今央视10月3日直播世乒赛小组赛赛程,国乒第三战陈幸同将出场头条创作挑战赛2022年10月3日成都世乒赛进入小组赛第四日,中国乒乓球队将进行第三战。前两场比赛马龙陈梦王曼昱出场两次,樊振东王楚钦孙颖莎王艺迪出场一次。国乒十名世乒赛参赛人员只世乒赛和奥运会的单打冠军运动员更想要哪个?哪个含金量更高些?中国乒乓球队历来都是重视大赛,而大赛冠军是作为衡量一个运动员实力的标准,到底是奥运冠军含金量更高还是世锦赛冠军更高?运动员又最想夺取哪个冠军呢?首先由于我们国家的国情不同,运动员肯世乒赛爆出三大冷门!二号种子输球,张本智和丢分,国乒连赢四场2022年10月3日,成都世乒赛继续进行,就在第三个比赛日,国乒大获全胜,小组赛阶段连赢四场,爆出三大冷门,男团二号种子输给印度队,邱党被印度选手加纳纳塞卡然逆转,张本智和不敌罗马
选秀模板巴特勒,场均28156率队夺冠,如今4年换4队26岁无人要被视为加强版巴特勒,场均28156夺冠军MVP,如今4年4队,才26岁无人要!他的运动能力实在太劲爆了,而且攻防两端都能打出统治级的表现,还能从2号位打到4号位,这简直就是未来的超最美科技志愿者刘时友废品堆淘出的牛科学人物名片刘时友,铜梁区玉泉小学教师,长期从事学校科学教育工作,拥有国家专利近50项,创办的牛科学科技教育抖音号开设的小牛顿公益课堂,深受学生喜爱。刘时友(中)正在进行科学知识教学。超限车为逃避检查结伴同行双簧演砸了为躲避高速执法检查,超限运输车也玩起结伴同行。这几个驾驶员可能以为只要有前面一辆车探路望风,后面的车至少不会一起被查,结果还是栽了。前一辆超限运输车被查。泉州高速执法支队供图2月2友谊的小船儿说翻就翻了!!!友谊的小船儿说翻就翻了!俄罗斯霸气买油不付钱,必须停供!!波兰奥伦石油公司2月25日表示,俄罗斯已经停止了通过友谊输油管道向波兰供应原油。对此,俄方2月27日回复停止输油的原因是波住5000万豪宅靠关系踢上球?妻子大义灭亲,吴兴涵要崩溃了近日,陈女士连续晒出她跟吴兴涵以及其妻子的两个聊天记录,里面有3个重要的点,值得关注一下。第一点,陈女士给吴兴涵的备注是鹏鹏,她也透露过吴兴涵是用刘会鹏这个名字跟她交往的。因为这个影像故事梅景如画!春天的氛围感拉满了莫愁冬日寒入骨,梅花开过便是春,在黄浦这个老牌公园里,比春天更早到来的是春日限定梅花。蓬莱公园内的40余株各色梅花已经逐步进入最佳观赏期。各色花瓣随着春风的吹拂,轻轻摇摆,一树树梅郁南去年一般公共预算收入增长率全省第二近日,记者从郁南县财政部门获悉,郁南去年一般公共预算收入增长率全省第二,财政管理绩效综合评价获省财政厅通报表扬。2022年,郁南县财政部门在云浮市财政局的业务指导下,按照县委县政府微信最新公告近日,微信安全中心发布最新公告严厉打击网络诈骗行为,对确认存在欺诈行为的账号支付账户进行封禁冻结等处理。网络诈骗是指犯罪分子编造虚假信息,设置骗局,通过互联网对受害人实施远程诈骗,今日银行理财新品(2月27日)南方财经2月27日电,南财理财通课题组选取近期正在发售或预售的5只新品供参考。据南财理财通数据显示,近期,信银理财推出的同盈象固收稳健三个月封闭6号理财产品值得关注。该产品业绩比较多领域加速推进北斗规模化应用央视网消息(新闻联播)最新数据显示,我国卫星导航与位置服务产业总体产值已达约4700亿元,中国北斗所带来的高精度位置服务,今年正在进一步深度融入各行各业。开年以后,越来越多的北斗农材料院举办2023年度新闻宣传业务培训班大众网海报新闻讯为提高各单位新闻宣传工作者的能力素养,2月24日下午,材料院采用现场和视频会议相结合的形式举办2023年度新闻宣传人员培训班,特邀中国兵工报副主编李亚明围绕新闻业务