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

详解数仓中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
  关注#华为云开发者联盟# ,第一时间了解华为云新鲜技术~

10月我国动力电池装车量30。5GWh,宁德时代与比亚迪在磷酸铁锂领域棋逢对手每经记者李硕每经编辑孙磊11月10日,中国汽车动力电池产业创新联盟发布的最新数据显示,10月我国动力电池装车量为30。5GWh,同比增长98。1,环比降低3。5。其中三元电池装车1对自己有要求,才能在实现梦想的路上越走越远人不能没有志气这是诸多老一辈人在教育年轻人时经常会用到的一句话。作为出生在新时代的我们来说,我们只会面临比上一辈更大的考验。那么如何去正视这些考验,如何去解决这些矛盾和困难,这不仅让人静心养性的人生格言,现实透彻,引人共鸣1。有些人适合成长,有些故事适合收藏,不是每一场相遇都有结局,但是每一场相遇都有意义。2。人生,没有永远的伤痛,再深的痛,伤口总会痊愈。人生,没有永远的爱情,没有结局的感情,总要结一枚火箭耗资41亿美元,能造10个空间站,但首飞就已推迟4次由于看到了中国稳步发展的太空探索计划,美国便加大了力气,在太空探索上投入了巨额的资金和人力,为将来的再度登月乃至登陆火星做准备。而美国要完成新的载人登月,给予厚望的就是其研制的新一阿波罗登月之谜?53年前的登月是惊世骗局?还是伟大创举?上世纪六十年代美苏争霸太空,美国著名的阿波罗登月计划,在阿波罗11号任务期间完成了人类首次登陆月球的壮举!阿姆斯特朗成为人类第一个登上月球的人。个人的一小步,人类的一大步!登月第一格陵兰岛部分冰盖变薄比预想严重,或致海平面升15。5毫米来源澎湃新闻丹麦美国等国研究人员9日公布的一项研究结果显示,格陵兰岛东北部冰盖变薄范围向内陆延伸200至300公里,范围比预想大,可能导致到本世纪末海平面上升至多15。5毫米。科学卷王之王omthingAirFreeBuds测评万魔声学是我一直关注的耳机企业,专万魔注专业声学与智能软硬件的研发,产品力一直很强,多次被评为中国十大耳机品牌。产品上保持声学先进技术的同时更加重视工业设计,从美观程度和舒适性上不十三香诚不欺我!intel十三代酷睿i713700K装机体验前言自从9月份的苹果iPhone14系列发布后,十三香的梗再次被广大网友实锤。而到了intel这边,按照原本intel的挤牙膏策略,我以为这次的十三代酷睿可能也就是小小的升级,但没致态TiPlus7100笔记本升级实战扩容增速省电兼得现在的笔记本电脑的机身越来越轻薄,可以说固态硬盘功不可没。但对于一些笔记本的入门版机型来说,低速低容量的固态硬盘往往是标配,日常办公娱乐可能都有些捉襟见肘。其实只要稍微具备点动手能三星欧洲GalaxyA535G开始推送安卓13OneUI5。0正式版IT之家11月9日消息,三星已经面向欧洲地区的GalaxyA535G发布了安卓13(OneUI5。0)稳定版更新。原本,这款手机计划在2022年12月获得OneUI5。0稳定版更新尼康Z9最佳搭配,雷克沙2TB大容量CFeB卡测试分享最近入手了一张2TB容量的CFeB存储卡,打算将微单作为旅拍机使用。很多人看到我存储卡,都惊讶地说买到扩容卡了吧TT其实这是我真金白银买的2TBCFexpressTypeBGOLD
脸上长斑雀斑老年斑影响你的颜值了吗1hr雀斑雀斑就是俗称的麻子脸,让很多爱美的女孩变得自卑,不愿外出。这在门诊中是很常见的疾病,很多人在儿童时期就开始长雀斑,因为它有一定遗传倾向,与基因有关。雀斑在我们黄种人发病率用百家号创作大脑激发你的写作热情问题场景写作不知怎么选题?想写一篇大家都需要的好文?但不知从何下笔?写作没有灵感?写作没有素材?写作没有XXX?解决思路如你写作到了山穷水尽绞尽脑汁,不如试试出自百度的百家号创作大vivoX90Pro上手多种高规格硬件加持,体验更加全能提到近期热度颇高的一款新机,相信很多朋友都会第一时间想到vivoX90系列。作为vivoX系列的十周年献礼之作,vivoX90系列在多个方面均有亮眼表现,并因此赢得了众多用户的青睐通讯Plus早报欧盟新法案尝试为飞机提供5G网络热水器小家电质量参差召回或成常态微信新增图片视频拖动一键发送功能微信iOS版8。0。31迎来内测更新,据网友称,新的内测版新增了图片视频拖动一键发送功能。据悉,微信iOS版8。0。31内测版更新带来的一些新功能有苹果开始开发20英寸可折叠显示器,可能用于未来的MacBookPro机型一段时间以来,关于苹果推出20英寸可折叠设备的传言一直在网上流传。今天,一份新的报告显示,苹果已经开始开发一款20英寸的可折叠显示器,有可能用于MacBookPro的新机型。援引行双12手机推荐,10001500元高性价比机型盘点,首发OLED曲面屏2022生机大会热门数码科技资讯早知道,快来关注作者。编辑孙凤新审核文峥双12手机推荐,主打高性价比,锁定10001500元热门5G机型。众所周知,OLED屏幕手机显示色彩出众,可城投具有长期价值,只是政府融资职能已经不复存在林晓东观点近期网传又有若干地方国企发布了不再承担政府融资职能退出政府融资平台的公告,在业内引起了一定的关注。实际上平台转型已经不是一个新事物了,但是围绕城投与融资平台的话题,却每逢重磅!2023年京东将取消1000一月的平台使用费,改收交易服务费2022年即将结束,在京东经营管理培训会刘强东怒批高管三小时,说高管们偏离了公司经营战略的核心即成本效率体验之后,京东平台也推出了不少的政策和变动。比如,针对部分产业带商家,给予1国美电器被强制执行7778万国美电器累计被执行8772万天眼查App显示,近日,国美电器有限公司国美电器零售有限公司国美电器内蒙古有限公司新增一则被执行人信息,执行标的7778万余元,执行法院为呼和浩特市赛罕雅居乐集团与农行广东省分行签署全面战略合作协议11月30日,雅居乐集团控股有限公司与中国农业银行股份有限公司广东省分行在广州举行战略合作签约仪式,签署了战略合作协议,双方将展开全面和深度合作,进一步深化银企合作关系。本次签约,广东严厉打击哄抬药品物价等违法行为新华社客户端广州12月8日电(记者胡林果)随着各地疫情相关政策调整优化,近期不少市民购买常用感冒药品。12月7日,广东省市场监督管理局就有关事项向药品和医疗器械经营者及相关单位发布