• [环境搭建] GaussDB 200 6.5.1 配置规划工具 04.xlsm---求模板
    【功能模块】GaussDB 200 6.5.1 配置规划工具 04.xlsm【操作步骤&问题现象】1、GaussDB 200 6.5.1 配置规划工具 04.xlsm这个模板 哪位大佬可以发给我一下,谢谢!
  • [萌新手册] GaussDB(DWS) 补丁、升级及扩容流程培训
    GaussDB(DWS) 补丁、升级及扩容流程培训
  • [技术干货] 华为云发布《云原生2.0架构白皮书》,GaussDB技术再升级
    近期,在华为伙伴暨开发者大会2022,华为云CTO张宇昕发布了《云原生2.0架构白皮书》,包括云原生数据库在内,介绍了云原生2.0的关键特征、架构模式,以及优秀实践,为企业数字化升级注入了云原生2.0新动力。华为云数据库首席架构师冯柯也在会上分享了云原生数据库HTAP重大特性商用,通过极致混合负载能力和及时精准的数据分析,助力企业商业决策。云原生数据库技术再创新早在去年,华为云便发布了《云原生2.0白皮书》,阐述了云原生2.0定义、价值及参考架构,解读了“资源高效、应用敏捷、业务智能、安全可信”四大价值以及预测未来发展趋势。而今年的《云原生2.0架构白皮书》,围绕架构升级,重点诠释了云原生2.0技术特征与架构设计模式,以云原生技术力量推动企业数字化转型升级。 云原生数据库作为白皮书的重要内容之一,在架构创新和技术特性方面均有重大突破。华为云云原生数据库GaussDB基于存算分离,并利用云原生数据库云存储 DFV 基于存储算子语义下推能力,支撑事务处理算子的并行下推;同时存储层支持日志回放能力,数据库写节点只需要把日志写到存储层,存储层就可以将日志回放为数据页面,并在多副本上提供一致性版本,大大节省了计算层和存储层的高速网络带宽。优化后的云原生GaussDB架构可以很好地解决热点数据问题,以及数据丢失、故障恢复等难题,面对客户高负载和各种复杂场景,表现更从容。 Serverless也是云原生数据库的关键特征之一。华为云云原生数据库GaussDB结合Serverless,只需创建数据库节点,指定所需的数据库容量范围,然后数据库处于工作状态期间按照每秒使用的数据库容量进行付费,同时利用华为云数据库的应用无损透明倒换技术 (ALT),规格变更可以实现应用基本无感知,让开发者专注于应用开发,无需关注资源。 此外,华为云数据库首席架构师冯柯还在会上介绍了云原生数据库GaussDB的另一重大特性——HTAP。云原生HTAP深度融合OLTP和OLAP两者优势,统一入口,自动分流,并且在行存和列存引擎上建立全局一致性事务视图,达到数据实时一致,支撑更多混合负载的场景。这种方式可以支持大量并发的更新,而且数据同步时延达到秒级或毫秒级,有效避免了传统解决方案中数据抽取、转换和装载等繁琐步骤,极大提升了数据处理的时效性,为企业提供实时精准的决策支持。目前该特性已正式商用。 云原生数据库优秀实践 云原生数据库GaussDB不仅在技术上硕果累累,还广泛应用于电商、制造业、交通、泛互联网等领域,历经关键行业的锤炼,并取得重大实践成果。 在电商行业,为了满足梦饷集团的发展需求,华为云云原生数据库GaussDB(for MySQL)助力梦饷集团打造高性能的云原生电商平台,通过平滑扩容和快速弹性升降能力,可从容应对突发业务流量,大促过后也可以及时回落,快速降低成本。而且运维效率提升约 30%,每秒成交的订单数再创历史新高,成为了利用数字基础设施助力业务快速增长的标杆。 在汽车行业,华为云云原生数据库GaussDB(for MySQL)成功助力中国一汽红旗ERP系统微服务改造升级,ERP 系统整体性能大幅提升,流量洪峰下业务运行又快又稳;提供了开放的 MySQL 生态,各业务协同更灵活。使用成本方面,每台数据库由原来最低600+万/年降低至100+万/年;生产效率方面,由原来几天才能出货 bom 单到最快 20 分钟内即可计算出一个生产计划的 bom 单;微服务的拆分提升了系统稳定性,提高了业务交付速度,系统扩展性更强。 云原生数据库未来趋势 云原生技术浪潮汹涌澎湃,一日千里,云原生2.0之后,我们如何踏浪前行、乘风破浪? 未来的技术世界我们无法掌控,但从现状出发,我们或许可以窥见端倪。随着跨Region技术的增强,高资源利用率的驱动,以及Serverless的普遍诉求,去 Region 化、智能弹性、Serverless数据库将是未来发展方向。 但在此之前,云原生数据库还有一段路要走,比如Serverless数据库未来需要具备智能弹性的能力,能够根据用户的历史负载计算出用户画像,依赖秒级监控能力,快速判断用户未来的负载趋势,提前为用户弹性伸缩好资源,避免用户负载冲击到资源规格上限,减少系统资源浪费。 虽有一定挑战,但也极具动力,华为云云原生数据库GaussDB将凝聚技术力量,锐意创新,助力更多企业业务智能化升级,深化数据服务能力,推进千行百业数字化转型。
  • [技术干货] 智慧园区数据平台DO GaussDB 100数据库关键字合集
    关键字GaussDB 100数据库中关键字就是有特殊用途的标识符,是数据库事先定义好的,有保留字和非保留字之分。根据标准,保留字决不能用做其他标识符,如:不能用作保留字段做表名、字段名等。非保留字只是在特定的环境里有特殊的含义,而在其他环境里是可以用做标识符的。表1 GaussDB 100关键字1ABORTABSOLUTEACCESSACCOUNT2ACTIONADDADMINAFTER3AGGREGATEALIASALLALSO4ALTERALWAYSANALYSEANALYZE5ANDANYARRAYAS6ASCASSERTIONASSIGNMENTASYMMETRIC7ATATTRIBUTEAUTHIDAUTHORIZATION8AUTOEXTENDBACKWARDBEFOREBEGIN9BETWEENBIGINTBINARYBINARY_DOUBLE10BINARY_INTEGERBITBLOBBOOLEAN11BOTHBYBYTEACACHE12CALLCALLEDCASCADECASCADED13CASECASTCATALOGCHAIN14CHARCHARACTERCHARACTERISTICSCHECK15CHECKPOINTCLASSCLOBCLOSE16CLUSTERCOALESCECOLLATECOLLATION17COLUMNCOMMENTCOMMENTSCOMMIT18COMMITTEDCOMPILECONCURRENTLYCONFIGURATION19CONNECTCONNECTIONCONSTRAINTCONSTRAINTS20CONTENTCONTENTSCONTEXTCONTINUE21CONVERSIONCOPYCOSTCREATE22CROSSCSVCURRENTCURRENT_CATALOG23CURRENT_DATECURRENT_ROLECURRENT_SCHEMACURRENT_TIME24CURRENT_TIMESTAMPCURRENT_USERCURSORCYCLE25DATADATABASEDATAFILEDATAFILES26DATEDAYDBTIMEZONEDEALLOCATE27DEBUGDECDECIMALDECLARE28DECODEDEFAULTDEFAULTSDEFERRABLE29DEFERREDDEFINERDELETEDELIMITER30DELIMITERSDESCDETAILDETERMINISTIC31DIAGNOSTICSDICTIONARYDIRECTORYDISABLE32DISCARDDISTINCTDODOCUMENT33DOMAINDOUBLEDROPDUMP34EACHELSEELSEIFELSIF35ENABLEENCODINGENCRYPTEDEND36ENUMERRCODEERRORESCAPE37EXCEPTEXCEPTIONEXCLUDEEXCLUDING38EXCLUSIVEEXECEXECUTEEXISTS39EXITEXPLAINEXTENSIONEXTERNAL40EXTRACTFALSEFAMILYFETCH41FIRSTFLOATFOLLOWINGFOR42FORALLFORCEFOREACHFOREIGN43FORWARDFREEZEFROMFULL44FUNCTIONFUNCTIONSGETGLOBAL45GRANTGRANTEDGREATESTGROUP46HANDLERHAVINGHEADERHINT47HOLDHOURIDENTIFIEDIDENTITY48IFILIKEIMMEDIATEIMMUTABLE49IMPLICITININCLUDINGINCREMENT50INDEXINDEXESINDEXTYPEINFO51INHERITINHERITSINITIALINITIALLY52INITRANSINLINEINNERINOUT53INPUTINSENSITIVEINSERTINSTEAD54INTINTEGERINTERSECTINTERVAL55INTOINVOKERISISNULL56ISOLATIONJOINKEYLABEL57LANGUAGELARGELASTLC_COLLATE58LC_CTYPELEADINGLEASTLEFT59LESSLEVELLEXERLIKE60LIMITLINKLISTENLOAD61LOCALLOCALTIMELOCALTIMESTAMPLOCATION62LOCKLOGLOGGINGLOOP63MAPPINGMATCHMAXEXTENTSMAXSIZE64MAXTRANSMAXVALUEMESSAGEMESSAGE_TEXT65MINEXTENTSMINUSMINUTEMINVALUE66MODEMODIFYMONTHMOVE67NAMENAMESNATIONALNATURAL68NCHARNEXTNLSSORTNO69NOCACHENOCYCLENOLOGGINGNONE70NOMAXVALUENOMINVALUENOORDERNOREVERSE71NOTNOTHINGNOTIFYNOTICE72NOTNULLNOWAITNULLNULLIF73NULLSNUMBERNUMERICNVARCHAR274NVLOBJECTOFOFF75OFFSETOIDSONONLY76OPENOPERATOROPTIONOPTIONS77ORORDEROUTOUTER78OVEROVERLAPSOVERLAYOWNED79OWNERPARAMETERSPARSERPARTIAL80PARTITIONPASSINGPASSWORDPCTFREE81PERFORMPG_EXCEPTION_CONTEXTPG_EXCEPTION_DETAILPG_EXCEPTION_HINT82PLACINGPLANSPOSITIONPRECEDING83PRECISIONPREPAREPREPAREDPRESERVE84PRIMARYPRIORPRIVILEGEPRIVILEGES85PROCEDURALPROCEDUREPROFILEQUERY86QUOTERAISERANGERAW87READREALREASSIGNRECHECK88RECURSIVEREFREFERENCESREINDEX89RELATIVERELEASERENAMEREPEATABLE90REPLACEREPLICARESETRESTART91RESTRICTRESULT_OIDRETURNRETURNED_SQLSTATE92RETURNINGRETURNSREUSEREVERSE93REVOKERIGHTROLEROLLBACK94ROWROWIDROWNUMROWS95ROWTYPEROW_COUNTRULESAVEPOINT96SCHEMASCROLLSECONDSECURITY97SELECTSEQUENCESEQUENCESSERIALIZABLE98SERVERSESSIONSESSIONTIMEZONESESSION_USER99SETSETOFSHARESHOW100SIMILARSIMPLESIZESLICE101SMALLINTSOMESQLSTATESTABLE102STACKEDSTANDALONESTARTSTATEMENT103STATISTICSSTDINSTDOUTSTOPLIST104STORAGESTRICTSTRIPSUBSTRING105SYMMETRICSYSDATESYSIDSYSTEM106SYSTIMESTAMPSYS_REFCURSORTABLETABLES107TABLESPACETEMPTEMPLATETEMPORARY108TEXTTHANTHENTIME109TIMESTAMPTOTRAILINGTRANSACTION110TREATTRIGGERTRIMTRUE111TRUNCATETRUSTEDTYPETYPES112UNBOUNDEDUNCOMMITTEDUNENCRYPTEDUNION113UNIQUEUNKNOWNUNLIMITEDUNLISTEN114UNLOCKUNLOGGEDUNTILUPDATE115USE_COLUMNUSE_VARIABLEUSERUSING116VACUUMVALIDVALIDATEVALIDATOR117VALUEVALUESVARCHARVARCHAR2118VARIABLE_CONFLICTVARIADICVARRAYVARYING119VERBOSEVERSIONVIEWVOLATILE120WARRINGWHENWHEREWHILE121WHITESPACEWINDOWWITHWITHOUT122WORKWRAPPERWRITEXML123XMLATTRIBUTESXMLCONCATXMLELEMENTXMLEXISTS124XMLFORESTXMLPARSEXMLPIXMLROOT125XMLSERIALIZEYEARYESZONE
  • [技术干货] 智慧园区数据平台DO GaussDB 200数据库关键字合集
    GaussDB 200数据库中,保留字决不能用做其他标识符。非保留字只是在特定的环境里有特殊的含义,而在其他环境里是可以用做标识符的。保留关键字和非保留关键字的约束与其他数据库一致,保留字任何地方都不能用。非保留,在特定场景下可以用。一般建议不要使用关键字做表名或者字段名。表1 GaussDB 200关键字1ABORTABSABSOLUTEACCESS2ACCOUNTACTIONADAADD3ADMINAFTERAGGREGATEALIAS4ALLALLOCATEALSOALTER5ALWAYSANALYSEANALYZEAND6ANYAPPAREARRAY7ASASCASENSITIVEASSERTION8ASSIGNMENTASYMMETRICATATOMIC9ATTRIBUTEAUTHIDAUTHORIZATIONAUTOEXTEND10AUTOMAPPEDAVGBACKWARDBARRIER11BEFOREBEGINBETWEENBIGINT12BINARYBINARY_DOUBLEBINARY_INTEGERBIT13BITVARBIT_LENGTHBLOBBOOLEAN14BOTHBUCKETSBREADTHBY15CCACHECALLCALLED16CARDINALITYCASCADECASCADEDCASE17CASTCATALOGCATALOG_NAMECHAIN18CHARCHARACTERCHARACTERISTICSCHARACTER_LENGTH19CHARACTER_SET_CATALOGCHARACTER_SET_NAMECHARACTER_SET_SCHEMACHAR_LENGTH20CHECKCHECKEDCHECKPOINTCLASS21CLEANCLASS_ORIGINCLOBCLOSE22CLUSTERCOALESCECOBOLCOLLATE23COLLATIONCOLLATION_CATALOGCOLLATION_NAMECOLLATION_SCHEMA24COLUMNCOLUMN_NAMECOMMAND_FUNCTIONCOMMAND_FUNCTION_CODE25COMMENTCOMMENTSCOMMITCOMMITTED26COMPATIBLE_ILLEGAL_CHARSCOMPLETECOMPRESSCOMPLETION27CONCURRENTLYCONDITIONCONDITION_NUMBERCONFIGURATION28CONNECTCONNECTIONCONNECTION_NAMECONSTRAINT29CONSTRAINTSCONSTRAINT_CATALOGCONSTRAINT_NAMECONSTRAINT_SCHEMA30CONSTRUCTORCONTAINSCONTENTCONTINUE31CONVERSIONCONVERTCOORDINATORCOPY32CORRESPONDINGCOSTCOUNTCREATE33CROSSCSVCUBECURRENT34CURRENT_CATALOGCURRENT_DATECURRENT_PATHCURRENT_ROLE35CURRENT_SCHEMACURRENT_TIMECURRENT_TIMESTAMPCURRENT_USER36CURSORCURSOR_NAMECYCLEDATA37DATE_FORMATDATABASEDATAFILEDATE38DATETIME_INTERVAL_CODEDATETIME_INTERVAL_PRECISIONDAYDBCOMPATIBILITY39DEALLOCATEDECDECIMALDECLARE40DECODEDEFAULTDEFAULTSDEFERRABLE41DEFERREDDEFINEDDEFINERDELETE42DELIMITERDELIMITERSDELTADEPTH43DEREFDESCDESCRIBEDESCRIPTOR44DESTROYDESTRUCTORDETERMINISTICDIAGNOSTICS45DICTIONARYDIRECTDISABLEDISCARD46DISCONNECTDISPATCHDISTINCTDISTRIBUTE47DISTRIBUTIONDODOCUMENTDOMAIN48DOUBLEDROPDYNAMICDYNAMIC_FUNCTION49DYNAMIC_FUNCTION_CODEEACHELASTICELSE50ENABLEENCODINGENCRYPTEDEND51END-EXECENFORCEDENUMEOL52EQUALSERRORSESCAPEESCAPING53EVERYEXCEPTEXCEPTIONEXCHANGE54EXCLUDEEXCLUDINGEXCLUSIVEEXEC55EXECUTEEXISTINGEXISTSEXPLAIN56EXTENSIONEXTERNALEXTRACTFALSE57FAMILYFASTFENCEDFETCH58FILEHEADERFILL_MISSING_FIELDSFINALFIRST59FIXEDFLOATFOLLOWINGFOR60FORCEFOREIGNFORMATTERFORTRAN61FORWARDFOUNDFREEFREEZE62FROMFULLFUNCTIONFUNCTIONS63GGENERALGENERATEDGET64GLOBALGOGOTOGRANT65GRANTEDGREATESTGROUPGROUPING66HANDLERHAVINGHEADERHIERARCHY67HOLDHOSTHOURIDENTIFIED68IDENTITYIFIGNOREIGNORE_EXTRA_DATA69ILIKEIMMEDIATEIMMUTABLEIMPLEMENTATION70IMPLICITININCLUDINGINCREMENT71INDEXINDEXESINDICATORINFIX72INHERITINHERITSINITIALINITIALIZE73INITIALLYINITRANSINLINEINNER74INOUTINPUTINSENSITIVEINSERT75INSTANCEINSTANTIABLEINSTEADINT76INTEGERINTERNALINTERSECTINTERVAL77INTOINVOKERISISNULL78ISOLATIONITERATEJOINK79KEYKEY_MEMBERKEY_TYPELABEL80LANGUAGELARGELASTLATERAL81LC_COLLATELC_CTYPELEADINGLEAKPROOF82LEASTLEFTLENGTHLESS83LEVELLIKELIMITLISTEN84LOADLOCALLOCALTIMELOCALTIMESTAMP85LOCATIONLOCATORLOCKLOG86LOGGINGLOGINLOOPLOWER87MMAPMAPPINGMATCH88MATCHEDMAXMAXEXTENTSMAXSIZE89MAXTRANSMAXVALUEMERGEMESSAGE_LENGTH90MESSAGE_OCTET_LENGTHMESSAGE_TEXTMETHODMIN91MINEXTENTSMINUSMINUTEMINVALUE92MODMODEMODIFIESMODIFY93MODULEMONTHMOREMOVE94MOVEMENTMUMPSNAMENAMES95NATIONALNATURALNCHARNCLOB96NEWNEXTNLSSORTNO97NOCOMPRESSNOCYCLENODENOLOGGING98NOLOGINNOMAXVALUENOMINVALUENONE99NOTNOTHINGNOTIFYNOTNULL100NOWAITNULLNULLABLENULLIF101NULLSNUMBERNUMERICNUMSTR102NVARCHAR2NVLOBJECTOCTET_LENGTH103OFOFFOFFSETOIDS104OLDONONLYOPEN105OPERATIONOPERATOROPTIMIZATIONOPTION106OPTIONSORORDERORDINALITY107OUTOUTEROUTPUTOVER108OVERLAPSOVERLAYOVERRIDINGOWNED109OWNERPACKAGEPADPARAMETER110PARAMETERSPARAMETER_MODEPARAMETER_NAMEPARAMETER_ORDINAL_POSITION111PARAMETER_SPECIFIC_CATALOGPARAMETER_SPECIFIC_NAMEPARAMETER_SPECIFIC_SCHEMAPARSER112PARTIALPARTITIONPARTITIONSPASCAL113PASSINGPASSWORDPATHPCTFREE114PERPERMPERCENTPERFORMANCE115PLACINGPLANPLANSPLI116POLICYPOOLPOSITIONPOSTFIX117PRECEDINGPRECISIONPREFERREDPREFIX118PREORDERPREPAREPREPAREDPRESERVE119PRIMARYPRIORPRIVATEPRIVILEGE120PRIVILEGESPROCEDURALPROCEDUREPROFILE121PUBLICQUERYQUOTERANGE122RAWREADREADSREAL123REASSIGNREBUILDRECHECKRECURSIVE124REFREFERENCESREFERENCINGREINDEX125REJECTRELATIVERELEASERELOPTIONS126REMOTERENAMEREPEATABLEREPLACE127REPLICARESETRESIZERESOURCE128RESTARTRESTRICTRESULTRETURN129RETURNED_LENGTHRETURNED_OCTET_LENGTHRETURNED_SQLSTATERETURNING130RETURNSREUSEREVOKERIGHT131ROLEROLLBACKROLLUPROUTINE132ROUTINE_CATALOGROUTINE_NAMEROUTINE_SCHEMAROW133ROWSROW_COUNTRULESAVEPOINT134SCALESCHEMASCHEMA_NAMESCOPE135SCROLLSEARCHSECONDSECTION136SECURITYSELECTSELFSENSITIVE137SEQUENCESEQUENCESSERIALIZABLESERVER138SERVER_NAMESESSIONSESSION_USERSET139SETOFSETSSHARESHIPPABLE140SHOWSIMILARSIMPLESIZE141SMALLDATETIMESMALLDATETIME_FORMATSMALLINTSNAPSHOT142SOMESOURCESPACESPECIFIC143SPECIFICTYPESPECIFIC_NAMESPILLSPLIT144SQLSQLCODESQLERRORSQLEXCEPTION145SQLSTATESQLWARNINGSTABLESTANDALONE146STARTSTATESTATEMENTSTATEMENT_ID147STATICSTATISTICSSTDINSTDOUT148STORAGESTORESTRICTSTRIP149STRUCTURESTYLESUBCLASS_ORIGINSUBLIST150SUBSTRINGSUMSUPERUSERSYMMETRIC151SYNONYMSYS_REFCURSORSYSDATESYSID152SYSTEMSYSTEM_USERTABLETABLES153TABLE_NAMETEMPTEMPLATETEMPORARY154TERMINATETEXTTHANTHEN155TIMETIME_FORMATTIMESTAMPTIMESTAMP_FORMAT156TIMEZONE_HOURTIMEZONE_MINUTETINYINTTO157TRAILINGTRANSACTIONTRANSACTIONS_COMMITTEDTRANSACTIONS_ROLLED_BACK158TRANSACTION_ACTIVETRANSFORMTRANSFORMSTRANSLATE159TRANSLATIONTREATTRIGGERTRIGGER_CATALOG160TRIGGER_NAMETRIGGER_SCHEMATRIMTRUE161TRUNCATETRUSTEDTYPETYPES162UESCAPEUNBOUNDEDUNCOMMITTEDUNDER163UNENCRYPTEDUNIONUNIQUEUNKNOWN164UNLIMITEDUNLISTENUNLOCKUNLOGGED165UNNAMEDUNNESTUNTILUNUSABLE166UPDATEUPPERUSAGEUSER167USER_DEFINED_TYPE_CATALOGUSER_DEFINED_TYPE_NAMEUSER_DEFINED_TYPE_SCHEMAUSING168VACUUMVALIDVALIDATEVALIDATION169VALIDATORVALUEVALUESVARCHAR170VARCHAR2VARIABLEVARIADICVARYING171VCGROUPVERBOSEVERIFYVERSION172VIEWVOLATILEWHENWHENEVER173WHEREWHITESPACEWINDOWWITH174WITHINWITHOUTWORKWORKLOAD175WRAPPERWRITEXMLXMLATTRIBUTES176XMLCONCATXMLELEMENTXMLEXISTSXMLFOREST177XMLPARSEXMLPIXMLROOTXMLSERIALIZE178YEARYESZONE-
  • [实践系列] DWS SQL调优的一些总结
    0. 统计信息-- 统计信息是动态调优的核心信息输入,统计信息准确与否,至关重要0.1 低效算子-- NEST LOOP0.2 不下推分析优化器在分布式框架下有三种执行计划优化策略* 下推语句执行计划:CN发送查询语句到DN直接执行,执行结果返回给CN。(DN间无需数据交换场景) 特征:Data Node Scan on *_REMOTE_FQS_QUERY_*例如:create table t1(a int,b int) distribute by (a);create table t2(a int,b int) distribute by (a);explain verbose select t1.* from t1  join t2 on t1.a = t2.a;-- t1和t2 都是分布表,t1.a 和 t2.a都是其分布列,join能匹配到的数据都在同一个DN上,因此DN间不需要数据交换,原语句直接下发到DN上执行即可。-- 此种语句在CH上打印的执行计划信息较少,可直接在DN上打印详细执行信息* 分布式计划:CN生成计划树,发送计划树给DN执行;DN执行完成后,将结果返回给CN。 特征:Streaming (type:GATHER) broadcast : 全表广播。全表数据量的数据向所有DN传输 redistribute : 重分布。不多于全表数据量的数据向所有DN传输。性能优于 broadcast gather :聚合流。聚合流将数据从多个查询片段聚合到一个。* 不下推执行计划:CN承担大量计算任务,导致性能劣化。优化器将部分查询(多为基表扫描语句,DN只扫描、不计算,不过滤)下推到DN执行,将获取到的中间结果返回给CN,CN再执行计划剩余的部分。 特征:Data Node Scan + _REMOTE_XXX 0.3 --优化思路和手段1.扫描慢1.1 建立单字段分区或多字段分区-- 逻辑上的一张表根据某种方案分成几张物理块进行存储,这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。-- 目前行存表、列存表仅支持范围分区和列表分区。(8.1.3)-- 有限地支持唯一约束和主键约束,即唯一约束和主键约束的约束键必须包含所有分区键。-- VACUUM和ANALYZE只会对主表起作用,要想分析分区表,需要分别分析每个分区表。-- 数据迁移到分区表后建议禁用主表,如果主表未执行vacuum操作,那么执行计划会全表扫描主表,非常耗时。•查看分区表信息,可使用系统表dba_tab_partitions。select * from dba_tab_partitions where table_name='tpcds.customer_address' --单子段分区partition by range(followup_create_time)(    partition p1 START('2022-01-01') END ('2022-06-30') EVERY (INTERVAL '1 day')) partition by range(order_date)(    partition p1 START('2022-01-01'::TIMESATMP(0)) END ('2022-06-30'::TIMESTAMP(0)) EVERY (INTERVAL '3 months')))  -- 多字段分区(多字段分区不能使用START END 来指定分区) WITH (orientation=column, compression=low, colversion=2.0, enable_delta=false) DISTRIBUTE BY HASH(imsi) PARTITION BY RANGE (idperiodo, idcalendario) (          PARTITION p_20201231 VALUES LESS THAN (202101, 20210101) TABLESPACE pg_default,          PARTITION p_20210101 VALUES LESS THAN (202101, 20210102) TABLESPACE pg_default)-- 查询分区select * from table_name partition('partition_name');1.1 行存表:建立btree保序索引 -- 涉及排序场景建立btree索引,目前行存btree索引保持排序,列存不保存排序结果。但是建立索引后,因为要排序,所以表在插入、更新时会有一定的性能影响。CREATE INDEX dws_tt_flink_eos_wide_01 ON dws_tt_flink_eos_wide USING btree(followup_create_time) local;1.2 列存表建立PCK(Partial Cluster Key(局部聚簇));局部聚簇存储,列存表导入数据时按照指定的列(单列或多列),进行局部排序。-- 一个表只能建立一个PCK-- 一个PCK可以包含多列,但是不建议超过两列-- 建议在查询中的简单表达式的过滤条件上建立PCK;如column >,=,< 常量。-- 在满足上面条件的情况下,选择distinct值比较少的列建立PCKCREATE TABLE tpcds.warehouse_t21(    W_WAREHOUSE_SK            INTEGER         NOT NULL,    PRIMARY KEY (column_name1,column_name2),    PARTIAL CLUSTER KEY(column_name1,column_name2))WITH (orientation=column, compression=low, colversion=2.0, enable_delta=false) DISTRIBUTE BY REPLICATION; 2.表结构orientation不支持修改。行列存储方式一旦建立,不能修改行存表:-- 点查询场景(大基表单表过滤查询,返回结果少,基于索引的简单查询,比如btree排序索引)-- 增删改较多的场景,并发增删改;实时数据接入等-- 行存表压缩功能暂未商用,如需使用请联系技术支持工程师。列存表:-- 多表关联的统计分析类场景-- 即席查询(查询条件列不确定,行存无法确定索引)-- 多表关联查询、聚合、分组查询等,访问大量行,少数列的场景。数据类型:-- 数据类型合理 变长可以变为定长的一律改为定长;变长在方便的同时,肯定会影响性能。-- 多个表间存在逻辑关系时,表示同一含义字段使用相同类型。字符串字段尽量使用变长数据类型。不建议使用定长数据类型。text,carchar  --> char(8)numeric(12,0) --> bigint2.1分布键选择合理 (不同DN间相差5%以上即可认为倾斜,10%以上必须调整分布列)-- ◾当指定DISTRIBUTE BY HASH (column_name)参数时,创建主键和唯一索引必须包含分布键。-- 查询数据分布:select table_skewness('table_name');-- 不指定分布方式时,默认第一个字段为分布键,进行hash分布-- 通常选取表的主键作为分布列-- 选择查询中关联条件作为分布列,以便Join任务可以下推到DN执行,且减少DN间的通信数据量。-- 复杂查询场景下,尽量不要选取存在常量等值过滤的列,避免剪枝后扫描集中在部分DN上。-- 点查询场景下,则应该尽量选取WHERE条件中的等值过滤条件列作为分布列。2.2 维度小表建立复制表  ,列存(数据量10万以下)CREATE TABLE tpcds.warehouse_t21(    W_WAREHOUSE_SK            INTEGER               NOT NULL)WITH (orientation=column, compression=low, colversion=2.0, enable_delta=false) DISTRIBUTE BY REPLICATION;2.3 列存表涉及更新,开启delta,不过在实时更新频繁时,还是搞不定,比如RDS服务实时导入数据的表,只能为行存表。CREATE TABLE tpcds.warehouse_t21(    W_WAREHOUSE_SK            INTEGER               NOT NULL)WITH (orientation=column, compression=low, colversion=2.0, enable_delta=on) DISTRIBUTE BY REPLICATION;2.4 行存表强制打开向量化(GUC控制台参数),执行计划走列存向量set enable_force_vector_engine=on-- 干预执行计划:best_agg_plan-- Stream执行框架分为如下三种计划形态:-- hashagg+gather(redistribute)+hashagg-- redistribute+hashagg(+gather)-- hashagg+redistribute+hashagg(+gather)-- GaussDB(DWS)提供了guc参数best_agg_plan来干预执行计划,强制其生成上述对应的执行计划,此参数取值范围为0,1,2,3-- •取值为1时,强制生成第一种计划。-- •取值为2时,如果group by列可以重分布,强制生成第二种计划,否则生成第一种计划。-- •取值为3时,如果group by列可以重分布,强制生成第三种计划,否则生成第一种计划。-- •取值为0时,优化器会根据以上三种计划的估算代价选择最优的一种计划生成。3.模糊匹配-- 建立全文索引create index index_name on table_name using gin(to_tsvector(col_name));select * from table_name where to_tsvector(col_name) @@ plainto_tsquery('某公司')----where            to_tsvector('zhparser',ef.remark ) @@ to_tsquery('%hiphi%')           --  ef.remark  like '%hiphi%'4.查询数据库大小(已用空间)select datname,pg_size_pretty(pg_database_size(datname)) from pg_database; 5.改写SQL5.1 not in -——> not exists6.query dop的输出信息含义Initial DOP: 7   -- 初始DOP  Avail(CPU/IO)/Max core: (7.92/8.00)/8.00        -- 语句可用CPU/IO/最大核数CPU/IO/Task util: 1.00/0.00/0                   -- 当前最大CPU/IO/DN作业个数Running/Active/Max statement: 160/0/21474836     --当前DN正在运行作业数/进入CN作业数/允许最大作业数(ma)Final Max DOP: 6   -- 最终DOP7.数据库float数据类型,小数点前面的0不显示oracle兼容的不显示小数点前的0,mysql兼容的显示;-- 创建兼容ORA格式的数据库:CREATE DATABASE ora_compatible_db DBCOMPATIBILITY 'ORA';-- DBCOMPATIBILITY [ = ] compatibilty_type;指定兼容的数据库的类型。取值范围:ORA、TD、MySQL。分别表示兼容Oracle、Teradata和MySQL数据库。若不指定该参数,默认为ORA。8.清空表:推荐使用truncate  操作,因为truncate操作会物理的清空数据表,并将其占用的空间归还给操作系统。
  • [技术干货] 探秘GaussDB,打造坚实金融数据新底座
    6月16日,2022年华为伙伴暨开发者大会在线上顺利进行,会上集结了众多行业专家、合作伙伴和客户,一起共话行业前沿趋势,探索技术新发展。在“探秘GaussDB,打造坚实金融数据新底座”专场,华为云数据库首席架构师冯柯、工商银行软件开发中心高级经理董勇明、上海掌数科技有限公司首席顾问邹昌根和华为云数据库创新LAB主任张文亮以线上的形式现身,与我们分享了GaussDB最新技术趋势,以及与华为云GaussDB合作背后的故事和实践经验。华为云GaussDB 技术创新之路永不停歇持续创新是华为一直以来坚持在做的事。当前,随着5G、IoT、AI、大数据的快速发展,数据量爆发式增长,数据库云化进一步提升,数据库行业也迎来了云原生2.0时代,这对数据库的性能、可靠性、可用性都有了更高的要求。华为云GaussDB多年来持续聚焦技术创新,构建以应用为中心的新型数据库云服务,让客户聚焦业务创新。在此次大会上,华为云数据库首席架构师冯柯重点介绍了刚刚正式商用的GaussDB云原生HTAP,如何为业务提供更加及时精准的数据分析,助力商业决策;ALT应用无损透明技术如何在遭遇故障、运维以及实例变更时保持业务不中断,实现真正的业务高可用;创新性地将NDP(Near Data Processing, 近数据处理) 和PQ(Parallel Query, 并行查询)相结合,打造了NDPQ(近数据并行处理),打破复杂查询性能天花板。GaussDB技术的优势正在赋能越来越多的企业客户实现高效数字化转型。工商银行核心系统转型 聚焦技术硬实力 夯实数据新底座“在数字化升级的道路上,我们选择了华为云GaussDB作为优秀的合作伙伴。”工商银行软件开发中心高级经理董勇明在分享中提到,工商银行对自身的核心交易系统的诉求有清晰的认知,自2019年和GaussDB联创以来,已有20多个业务系统相继试点上线。去年,在开放平台大型业务系统传统集中式数据库转型领域,双方持续技术攻关,初步形成了整套的系统性技术资产和解决方案,为金融行业提供了低成本、高效可控的转型借鉴。 “这一路的联创实践,充分验证了传统集中式数据库向分布式数据库转型的可行性,为大型商业银行核心系统转型趟出了一条宽阔的道路。未来,工商银行将继续依托产学研联合创新机制,与包括华为在内业界领先企业深入开展联合技术攻关与融合共建,共建金融科技新生态”董勇明说。 掌数科技&华为云GaussDB 助力证券行业金融创新  打造行业标杆“数据库技术作为根技术,在华为生态体系建设中是非常重要的,这也是我们所看重的。”上海掌数科技有限公司首席顾问邹昌根说到。 掌数科技是一家聚焦于证券和大资管行业,面向数据库和大数据技术、智能化场景应用以及行业信息技术应用创新领域的金融科技企业,服务于全国80+大型金融机构客户。 掌数科技作为华为在金融证券行业首家数据库技术领域的全面合作伙伴,以法人清算系统为行业典型应用场景,形成了以GaussDB为数据底座的一系列全栈式金融创新方案,并已经在证券行业展开试点应用。该方案不仅规划设计了两地三中心的网络高可用架构,也提供了完善的容灾安全保障,以及一整套、全面的基于GaussDB的技术支撑与服务体系。 邹昌根表示:“我们期待通过与华为云GaussDB的合作,能够从多个维度保障创新项目的实施落地,让行业充分感知价值,展现我们优秀的实践经验;我们也将共同推进服务能力与体系建设,从而真正形成完整的GaussDB生态体系。”探秘openGemini 共建开源时序数据库新生态同时,在GaussDB数据库专场,华为云数据库创新LAB主任张文亮也对刚刚开源的时序时空数据库做了技术解读。“为了更好地推动数字化产业的创新发展,我们决定把自己的时序数据库GaussDB(for Influx)对外开源,开源社区叫openGemini,这是继openGauss开源之后,华为开源的又一数据库根技术。”张文亮说。 openGemini时序时空数据库面向物联网、运维监控等业务场景,具备创新的架构设计、卓越的读写性能、高效的数据分析能力和数据压缩能力,帮助企业经济高效地处理海量时序数据。openGemini开源后将秉持着“基于创新技术、贡献产业发展,开放合作,共建共享”的生态策略,和开发者、企业一起,完善周边工具和南北向的生态,共同繁荣openGemini的技术生态。 展望未来,华为云GaussDB将持续深耕技术创新,继续携手工商银行和掌数科技,以及越来越多的企业伙伴,以技术赋能业务数字化升级,并持续贡献openGauss和openGemini开源生态,为行业发展创造更多价值!
  • [技术干货] 智慧园区数据平台DO GaussDB 100和GaussDB 200的差异点(下)
    字段的类型校验GaussDB 100数据库:对字段的类型校验严格,如果两个表的关联字段类型不匹配,那关联时会失败;同时源表里的字段和目标表里面对应的字段不匹配,在插入到表时也会报错。在GaussDB 100数据库中,在关联查询中,每个临时表中的字段通过转换函数明确类型,字段类型和表模型保持一致。例如:脚本中查询临时表的多条select语句通过UNION ALL联合,select语句中的每个临时表中的字段都需要通过转换函数明确类型,字段类型和表模型保持一致。表6 字段的类型校验GaussDB 100数据库:对字段的类型校验严格GaussDB 200数据库:对字段的类型校验不严格,类型转换比较灵活。insert into dm_energy.dm_energy_coldsite_control_indicator_f( park_code ) select * from( select T.park_code :: character varying(100) from T where T.is_freeze_flow_speed :: boolean = true union all select T.park_code :: character varying(100) from T where T.is_freeze_flow_speed :: boolean = false);insert into dm_energy.dm_energy_coldsite_control_indicator_f( park_code ) select * from( select T.park_code from T where T.is_freeze_flow_speed = true union all select T.park_code from T where T.is_freeze_flow_speed = false);时间格式在GaussDB 100数据库中,to_timestamp函数需要格式化时间和规定格式需要一致。to_timestamp('2020-07-16 00:00:00','YYYY-MM-DD HH24:mi:SS')(支持) to_timestamp('20200716000000','YYYYMMDDHH24miSS') 转换后时间格式均为YYYY-MM-DD HH24:mi:SS(支持) to_timestamp('20200716000000','YYYY-MM-DD HH24:mi:SS') (不支持)GaussDB 200数据库:to_timestamp函数需要格式化时间和规定格式可以不一致。to_timestamp('2020-07-16 00:00:00','YYYY-MM-DD HH24:mi:SS')(支持) to_timestamp('20200716000000','YYYY-MM-DD HH24:mi:SS') (支持)
  • [技术干货] 智慧园区数据平台DO GaussDB 100和GaussDB 200的差异点(中)
    GaussDB 100的SQL语句使用别名表5 SQL语句的别名在GaussDB 100数据库中,SQL语句不支持直接使用别名。在一条SQL的where条件后使用数据库表里面的字段,而不是重命名的字段。GaussDB 200数据库:SQL语句支持直接使用别名单表简单查询: select workorder_id as order_id from dwi_order.dwi_order_instance where workorder_id = '441911'; 嵌套子查询: select "record_time","electricity_price" , "cost" as count1, "park_code" from ( SELECT record_time as "record_time", electricity_price as "electricity_price", cost as "cost", park_code as "park_code" FROM dm_energy.dm_energy_coldsite_cost_f a where 1=1 order by record_time asc) where "cost" = 1; 两个表关联查询: select substr(to_char(inc.occur_date,'yyyy-MM-dd'),1,10) occur_date_key, inc.alarm_def_category_type_id, inc.incident_type as type, inc.incident_type_cn as type_cn, count(incident_type) cot , inc.dw_batch_number , spa.park_code from (select * from dwr_event.dwd_event_incident_records_f tab1 where not exists(select 1 from dwr_event.dwd_event_incident_records_f where incident_code=tab1.incident_code and dw_batch_number>tab1.dw_batch_number) ) inc --关联空间维表 left join dwr_dim.dim_space_record_d spa on inc.space_code=spa.id where inc.incident_type in ('SafetyAlarm','FireAlarm') and incident_code not in (select incident_code from dwr_event.dwd_event_incident_records_f where 1=1 ) group by inc.alarm_def_category_type_id,inc.occur_date,type_cn,inc.incident_type,inc.dw_batch_number,park_code;单表简单查询: select workorder_id as order_id from dwi_order.dwi_order_instance where order_id = '441911'; 嵌套子查询: select "record_time", "electricity_price", "cost" as count1, "park_code" from ( SELECT record_time as "record_time", electricity_price as "electricity_price", cost as "cost", park_code as "park_code" FROM dm_energy.dm_energy_coldsite_cost_f a where 1=1 order by record_time asc) where count1 = 1; 两个表关联查询: select substr(to_char(inc.occur_date,'yyyy-MM-dd'),1,10) occur_date_key, inc.alarm_def_category_type_id, inc.incident_type as type, inc.incident_type_cn as type_cn, count(incident_type) cot , inc.dw_batch_number , spa.park_code from (select * from dwr_event.dwd_event_incident_records_f tab1 where not exists (select 1 from dwr_event.dwd_event_incident_records_f where incident_code=tab1.incident_code and dw_batch_number>tab1.dw_batch_number) ) inc --关联空间维表 left join dwr_dim.dim_space_record_d spa on inc.space_code = spa.id where type in ('SafetyAlarm','FireAlarm') and incident_code not in (select incident_code from dwr_event.dwd_event_incident_records_f where 1=1 ) group by inc.alarm_def_category_type_id,inc.occur_date,type_cn,type,inc.dw_batch_number,park_code;
  • [技术干货] 智慧园区数据平台DO GaussDB 100和GaussDB 200的差异点(上)
    Cube环境使用的是GaussDB 100数据库,公有云环境使用的是GaussDB 200数据库。两者脚本开发时差异点如下:大小写区分GaussDB 100数据库:严格区分大小写,不加引号默认是大写。加引号后,引号里面的内容格式不变。GaussDB 200数据库:表名、字段无论加不加引号,都是创建的小写的表名和字段名。所以GaussDB 100数据库脚本开发规范:在GaussDB 100数据库中,建表语句ddl的表名、schema名和字段名不要加引号。表1 数据库ddl示例GaussDB 100数据库ddl示例GaussDB 200数据库ddl示例CREATE TABLE IF NOT EXISTS dm_asset.dm_asset_dept_distribution_f ( id serial, dw_creation_by character varying(100), dw_creation_date timestamp without time zone, dw_last_update_by character varying(100), dw_last_update_date timestamp without time zone, dw_batch_number bigint ) WITH (orientation=row, compression=no) DISTRIBUTE BY HASH (id); COMMENT ON TABLE dm_asset.dm_asset_dept_distribution_f IS '部门资产归总表(Table of department assets summarized)'; COMMENT ON COLUMN dm_asset.dm_asset_dept_distribution_f.id IS 'id'; COMMENT ON COLUMN dm_asset.dm_asset_dept_distribution_f.dw_creation_by IS '数据创建者(The creator)'; COMMENT ON COLUMN dm_asset.dm_asset_dept_distribution_f.dw_creation_date IS '数据创建时间(Creation date)'; COMMENT ON COLUMN dm_asset.dm_asset_dept_distribution_f.dw_last_update_by IS '数据最后更新者(Last updater)'; COMMENT ON COLUMN dm_asset.dm_asset_dept_distribution_f.dw_last_update_date IS '最后更新时间(Last update date)'; COMMENT ON COLUMN dm_asset.dm_asset_dept_distribution_f.dw_batch_number IS '批次号(Data batch number)';CREATE TABLE IF NOT EXISTS "dm_asset"."dm_asset_dept_distribution_f" ( id serial, dw_creation_by character varying(100), dw_creation_date timestamp without time zone, dw_last_update_by character varying(100), dw_last_update_date timestamp without time zone, dw_batch_number bigint ) WITH (orientation=row, compression=no) DISTRIBUTE BY HASH (id); COMMENT ON TABLE "dm_asset"."dm_asset_dept_distribution_f" IS '部门资产归总表(Table of department assets summarized)'; COMMENT ON COLUMN "dm_asset"."dm_asset_dept_distribution_f".id IS 'id'; COMMENT ON COLUMN "dm_asset"."dm_asset_dept_distribution_f".dw_creation_by IS '数据创建者(The creator)'; COMMENT ON COLUMN "dm_asset"."dm_asset_dept_distribution_f".dw_creation_date IS '数据创建时间(Creation date)'; COMMENT ON COLUMN "dm_asset"."dm_asset_dept_distribution_f".dw_last_update_by IS '数据最后更新者(Last updater)'; COMMENT ON COLUMN "dm_asset"."dm_asset_dept_distribution_f".dw_last_update_date IS '最后更新时间(Last update date)'; COMMENT ON COLUMN "dm_asset"."dm_asset_dept_distribution_f".dw_batch_number IS '批次号(Data batch number)';在GaussDB 100数据库中,DGC的脚本SQL涉及到的表名、字段名不需要加引号。表2 DGC的SQL示例GaussDB 100数据库DGC的SQL示例GaussDB 200数据库DGC的SQL示例--查询表 select * from dm_asset.dm_asset_dept_distribution_f; --资产基本信息视图 create or replace view dm_asset.logic_depts_view as( ... ); --删除视图 drop view dm_asset.logic_depts_view;--查询表 select * from dm_asset."dm_asset_dept_distribution_f"; --资产基本信息视图 create or replace view dm_asset."logic_depts_view" as( ... ); --删除视图 drop view dm_asset."logic_depts_view";在GaussDB 100数据库中,自定义函数或者方法里函数名称、方法名称和涉及到的表名等(例如:end;$$language plpgsql;),需要写成没有引号的。表3 自定义函数或者方法示例GaussDB 100数据库自定义函数或者方法示例GaussDB 200数据库自定义函数或者方法示例--创建自定义函数 create or replace function dm_asset.func_find_dept(current_id text) returns text[][] as $$ declare cursor_id text; ... begin select org_id,org_name,parent_code from dwr_dim.dim_org_base_d where org_id = current_id into cursor_id; ... end; $$ language plpgsql--创建自定义函数 create or replace function dm_asset."func_find_dept"(current_id text) returns text[][] as $$ declare cursor_id text; ... begin select org_id,org_name,parent_code from dwr_dim."dim_org_base_d" where org_id = current_id into cursor_id; ... end; $$ language 'plpgsql'在GaussDB 100数据库中,由于DWS默认是小写,所以在ROMA里面的API接口返回必须进行重命名,使得从GaussDB 100和DWS取出的数据字段是一致的。表4 ROMA接口的SQL示例GaussDB 100数据库ROMA接口的SQL示例GaussDB 200数据库ROMA接口的SQL示例SELECT TOP_TYPE_ID as "top_type_id", TOP_TYPE_CN as "top_type_name", ASSET_COUNT as "asset_count", ASSET_COST as "asset_cost", ... FROM dm_asset.dm_asset_distribution_f WHERE summary_code = '2';SELECT TOP_TYPE_ID, TOP_TYPE_CN, ASSET_COUNT, ASSET_COST, ... FROM dm_asset."dm_asset_distribution_f" WHERE summary_code = '2';
  • [最佳实践] 创建Flink OpenSource作业从Postgres CDC源表读取数据写入到DWS
    场景描述CDC是变更数据捕获(Change Data Capture)技术的缩写,它可以将源数据库的增量变动记录,同步到一个或多个数据目的中。CDC在数据同步过程中,还可以对数据进行一定的处理,例如分组(GROUP BY)、多表的关联(JOIN)等。本示例通过创建Postgres CDC源表来监控Postgres的数据变化,并将变化的数据信息插入到DWS数据库中。前提条件已创建RDS Postgres实例,具体步骤可参考:RDS PostgreSQL快速入门。本示例创建的RDS Postgres数据库版本选择为:11。说明:创建的RDS Postgres数据库版本不能低于11。已创建DWS实例,具体创建DWS集群的操作可以参考创建DWS集群。本示例创建的DWS集群版本为:8.1.1.205。整体作业开发流程整体作业开发流程参考图1。图1 作业开发流程步骤1:创建队列:创建DLI作业运行的队列。步骤2:创建RDS Postgres数据库:创建RDS Postgres的数据库和表。步骤3:创建DWS数据库和表:创建用于接收数据的DWS数据库和表。步骤4:创建增强型跨源连接:DLI上创建连接RDS和DWS的跨源连接,打通网络。步骤5:运行作业:DLI上创建和运行Flink OpenSource作业。步骤6:发送数据和查询结果:RDS Postgres的表上插入数据,在DWS上查看运行结果。步骤1:创建队列登录DLI管理控制台,在左侧导航栏单击“资源管理 > 队列管理”,可进入队列管理页面。在队列管理界面,单击界面右上角的“购买队列”。在“购买队列”界面,填写具体的队列配置参数,具体参数填写参考如下。计费模式:选择“包年/包月”或“按需计费”。本示例选择“按需计费”。区域和项目:保持默认值即可。名称:填写具体的队列名称。说明:新建的队列名称,名称只能包含数字、英文字母和下划线,但不能是纯数字,且不能以下划线开头。长度限制:1~128个字符。队列名称不区分大小写,系统会自动转换为小写。类型:队列类型选择“通用队列”。“按需计费”时需要勾选“专属资源模式”。AZ策略、CPU架构、规格:保持默认即可。企业项目:当前选择为“default”。高级选项:选择“自定义”。网段:配置队列网段。例如,当前配置为10.0.0.0/16。注意:队列的网段不能和DMS Kafka、RDS MySQL实例的子网网段有重合,否则后续创建跨源连接会失败。其他参数根据需要选择和配置。图2 创建队列参数配置完成后,单击“立即购买”,确认配置信息无误后,单击“提交”完成队列创建。步骤2:创建RDS Postgres数据库登录RDS管理控制台,在“实例管理”界面,选择已创建的RDS Postgres实例,选择操作列的“更多 > 登录”,进入数据管理服务实例登录界面。输入实例登录的用户名和密码。单击“登录”,即可进入RDS Postgres数据库并进行管理。在数据库实例界面,单击“新建数据库”,数据库名定义为:testrdsdb,字符集保持默认即可。在testrdsdb数据库下,单击“新建Schema”,Schema名称输入为:test。在test的Schema所在行,单击“操作”列的“打开Schema”。单击“SQL查询”,输入以下创建表语句,创建RDS Postgres表。create table test.cdc_order( order_id VARCHAR, order_channel VARCHAR, order_time VARCHAR, pay_amount FLOAT8, real_pay FLOAT8, pay_time VARCHAR, user_id VARCHAR, user_name VARCHAR, area_id VARCHAR, primary key(order_id));在Postgre中执行下列SQL语句。ALTER TABLE test.cdc_order REPLICA IDENTITY FULL;步骤3:创建DWS数据库和表参考使用gsql命令行客户端连接DWS集群连接已创建的DWS集群。执行以下命令连接DWS集群的默认数据库“gaussdb”:gsql -d gaussdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -rgaussdb:DWS集群默认数据库。DWS集群连接地址:请参见获取集群连接地址进行获取。如果通过公网地址连接,请指定为集群“公网访问地址”或“公网访问域名”,如果通过内网地址连接,请指定为集群“内网访问地址”或“内网访问域名”。如果通过弹性负载均衡连接,请指定为“弹性负载均衡地址”。dbadmin:创建集群时设置的默认管理员用户名。-W:默认管理员用户的密码。在命令行窗口输入以下命令创建数据库“testdwsdb”。CREATE DATABASE testdwsdb;执行以下命令,退出gaussdb数据库,连接新创建的数据库“testdwsdb”。\q gsql -d testdwsdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -r执行以下命令创建表。create schema test; set current_schema= test; drop table if exists dws_order; CREATE TABLE dws_order ( order_id VARCHAR, order_channel VARCHAR, order_time VARCHAR, pay_amount FLOAT8, real_pay FLOAT8, pay_time VARCHAR, user_id VARCHAR, user_name VARCHAR, area_id VARCHAR );步骤4:创建增强型跨源连接创建DLI连接RDS的增强型跨源连接在RDS管理控制台,选择“实例管理”,单击对应的RDS实例名称,进入到RDS的基本信息页面。在“基本信息”的“连接信息”中获取该实例的“内网地址”、“数据库端口”、“虚拟私有云”和“子网”信息,方便后续操作步骤使用。单击“连接信息”中的安全组名称,在“入方向规则”中添加放通队列网段的规则。例如,本示例队列网段为“10.0.0.0/16”,则规则添加为:优先级选为:1,策略选为:允许,协议选择:TCP,端口值不填,类型:IPV4,源地址为:10.0.0.0/16,单击“确定”完成安全组规则添加。登录DLI管理控制台,在左侧导航栏单击“跨源管理”,在跨源管理界面,单击“增强型跨源”,单击“创建”。在增强型跨源创建界面,配置具体的跨源连接参数。具体参考如下。连接名称:设置具体的增强型跨源名称。本示例输入为:dli_rds。弹性资源池:选择步骤1:创建队列中已经创建的队列。虚拟私有云:选择RDS的虚拟私有云。子网:选择RDS的子网。其他参数可以根据需要选择配置。参数配置完成后,单击“确定”完成增强型跨源配置。单击创建的跨源连接名称,查看跨源连接的连接状态,等待连接状态为:“已激活”后可以进行后续步骤。单击“队列管理”,选择操作的队列,本示例为步骤1:创建队列中创建的队列,在操作列,单击“更多 > 测试地址连通性”。在“测试连通性”界面,根据2中获取的RDS连接信息,地址栏输入“RDS内网地址:RDS数据库端口”,单击“测试”测试DLI到RDS网络是否可达。创建DLI连接DWS的增强型跨源连接在DWS管理控制台,选择“集群管理”,单击已创建的DWS集群名称,进入到DWS的基本信息页面。在“基本信息”的“数据库属性”中获取该实例的“内网IP”、“端口”,“基本信息”页面的“网络”中获取“虚拟私有云”和“子网”信息,方便后续操作步骤使用。单击“连接信息”中的安全组名称,在“入方向规则”中添加放通队列网段的规则。例如,本示例队列网段为“10.0.0.0/16”,则规则添加为:优先级选为:1,策略选为:允许,协议选择:TCP,端口值不填,类型:IPV4,源地址为:10.0.0.0/16,单击“确定”完成安全组规则添加。登录DLI管理控制台,在左侧导航栏单击“跨源管理”,在跨源管理界面,单击“增强型跨源”,单击“创建”。说明:本示例默认RDS和DWS实例分别在两个VPC和子网下,所以要分别创建增强型跨源连接打通网络。如果RDS和DWS实例属于同一VPC和子网下,则创建增强型跨源一次即可,4和5不需要再执行。在增强型跨源创建界面,配置具体的跨源连接参数。具体参考如下。连接名称:设置具体的增强型跨源名称。本示例输入为:dli_dws。弹性资源池:选择步骤1:创建队列中已经创建的队列。虚拟私有云:选择DWS的虚拟私有云。子网:选择DWS的子网。其他参数可以根据需要选择配置。参数配置完成后,单击“确定”完成增强型跨源配置。单击创建的跨源连接名称,查看跨源连接的连接状态,等待连接状态为:“已激活”后可以进行后续步骤。单击“队列管理”,选择操作的队列,本示例为步骤1:创建队列中创建的队列,在操作列,单击“更多 > 测试地址连通性”。在“测试连通性”界面,根据2中获取的DWS连接信息,地址栏输入“DWS内网IP:DWS端口”,单击“测试”测试DLI到DWS网络是否可达。步骤5:运行作业在DLI管理控制台,单击“作业管理 > Flink作业”,在Flink作业管理界面,单击“创建作业”。在创建队列界面,类型选择“Flink OpenSource SQL”,名称填写为:FlinkCDCPostgreDWS。单击“确定”,跳转到Flink作业编辑界面。在Flink OpenSource SQL作业编辑界面,配置如下参数。所属队列:选择步骤1:创建队列中创建的队列。Flink版本:选择1.12。保存作业日志:勾选。OBS桶:选择保存作业日志的OBS桶,根据提示进行OBS桶权限授权。开启Checkpoint:勾选。Flink作业编辑框中输入具体的作业SQL,本示例作业参考如下。SQL中加粗的参数需要根据实际情况修改。说明:本示例使用的Flink版本为1.12,故Flink OpenSource SQL语法也是1.12。本示例数据源是Kafka,写入结果数据到Elasticsearch,故请参考Flink OpenSource SQL 1.12创建Postgres CDC源表和Flink OpenSource SQL 1.12创建DWS结果表。create table PostgreCdcSource( order_id string, order_channel string, order_time string, pay_amount double, real_pay double, pay_time string, user_id string, user_name string, area_id STRING, primary key (order_id) not enforced ) with ( 'connector' = 'postgres-cdc', 'hostname' = '192.168.15.153',--IP替换为RDS Postgres的实例IP 'port' = '5432',--端口替换为RDS Postgres的实例端口 'username' = 'xxxxx',--RDS Postgres实例的数据库用户名 'password' = 'xxxxx',-RDS Postgres实例的数据库用户密码 'database-name' = 'testrdsdb',--RDS Postgres实例的数据库名 'schema-name' = 'test',--RDS Postgres数据库下的schema 'table-name' = 'cdc_order'--RDS Postgres数据库下的表名 ); create table dwsSink( order_id string, order_channel string, order_time string, pay_amount double, real_pay double, pay_time string, user_id string, user_name string, area_id STRING, primary key(order_id) not enforced ) with ( 'connector' = 'gaussdb', 'driver' = 'com.huawei.gauss200.jdbc.Driver', 'url' = 'jdbc:gaussdb://192.168.168.16:8000/testdwsdb', ---192.168.168.16:8000替换为DWS的内网IP和端口,testdwsdb为创建的DWS数据库名 'table-name' = 'test\".\"dws_order', ---test为创建的DWS表的schema,dws_order为对应的DWS表名 'username' = 'xxxxx',--替换为DWS实例的用户名 'password' = 'xxxxx',--替换为DWS实例的用户密码 'write.mode' = 'insert' ); insert into dwsSink select * from PostgreCdcSource where pay_amount > 100;单击“语义校验”确保SQL语义校验成功。单击“保存”,保存作业。单击“启动”,启动作业,确认作业参数信息,单击“立即启动”开始执行作业。等待作业运行状态变为“运行中”。步骤6:发送数据和查询结果登录RDS管理控制台,在“实例管理”界面,选择已创建的RDS Postgres实例,选择操作列的“更多 > 登录”,进入数据管理服务实例登录界面。输入实例登录的用户名和密码。单击“登录”,即可进入RDS Postgres数据库并进行管理。在已创建的数据库的操作列,单击“SQL查询”,输入以下创建表语句,插入测试数据。insert into test.cdc_order values ('202103241000000001','webShop','2021-03-24 10:00:00','50.00','100.00','2021-03-24 10:02:03','0001','Alice','330106'), ('202103251606060001','appShop','2021-03-24 12:06:06','200.00','180.00','2021-03-24 16:10:06','0002','Jason','330106'), ('202103261000000001','webShop','2021-03-24 14:03:00','300.00','100.00','2021-03-24 10:02:03','0003','Lily','330106'), ('202103271606060001','appShop','2021-03-24 16:36:06','99.00','150.00','2021-03-24 16:10:06','0001','Henry','330106');参考使用gsql命令行客户端连接DWS集群连接已创建的DWS集群。执行以下命令连接DWS集群的默认数据库“testdwsdb”:gsql -d testdwsdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -r执行以下语句,查询DWS的表数据。select * from test.dws_order;查询结果参考如下:order_channel order_channel order_time pay_amount real_pay pay_time user_id user_name area_id 202103251606060001 appShop 2021-03-24 12:06:06 200.0 180.0 2021-03-24 16:10:06 0002 Jason 330106 202103261000000001 webShop 2021-03-24 14:03:00 300.0 100.0 2021-03-24 10:02:03 0003 Lily 330106
  • [最佳实践] 创建Flink OpenSource作业从MySQL CDC源表读取数据写入到DWS
    场景描述CDC是变更数据捕获(Change Data Capture)技术的缩写,它可以将源数据库的增量变动记录,同步到一个或多个数据目的中。CDC在数据同步过程中,还可以对数据进行一定的处理,例如分组(GROUP BY)、多表的关联(JOIN)等。本示例通过创建MySQL CDC源表来监控MySQL的数据变化,并将变化的数据信息插入到DWS数据库中。前提条件已创建RDS MySQL实例,具体步骤可参考:RDS MySQL快速入门。本示例创建的RDS MySQL数据库版本选择为:8.0。已创建DWS实例,具体创建DWS集群的操作可以参考创建DWS集群。本示例创建的DWS集群版本为:8.1.1.205。整体作业开发流程整体作业开发流程参考图1。图1 作业开发流程步骤1:创建队列:创建DLI作业运行的队列。步骤2:创建RDS MySQL数据库和表:创建RDS MySQL的数据库和表。步骤3:创建DWS数据库和表:创建用于接收数据的DWS数据库和表。步骤4:创建增强型跨源连接:DLI上创建连接RDS和DWS的跨源连接,打通网络。步骤5:运行作业:DLI上创建和运行Flink OpenSource作业。步骤6:发送数据和查询结果:RDS MySQL的表上插入数据,在DWS上查看运行结果。步骤1:创建队列登录DLI管理控制台,在左侧导航栏单击“资源管理 > 队列管理”,可进入队列管理页面。在队列管理界面,单击界面右上角的“购买队列”。在“购买队列”界面,填写具体的队列配置参数,具体参数填写参考如下。计费模式:选择“包年/包月”或“按需计费”。本示例选择“按需计费”。区域和项目:保持默认值即可。名称:填写具体的队列名称。说明:新建的队列名称,名称只能包含数字、英文字母和下划线,但不能是纯数字,且不能以下划线开头。长度限制:1~128个字符。队列名称不区分大小写,系统会自动转换为小写。类型:队列类型选择“通用队列”。“按需计费”时需要勾选“专属资源模式”。AZ策略、CPU架构、规格:保持默认即可。企业项目:当前选择为“default”。高级选项:选择“自定义”。网段:配置队列网段。例如,当前配置为10.0.0.0/16。注意:队列的网段不能和DMS Kafka、RDS MySQL实例的子网网段有重合,否则后续创建跨源连接会失败。其他参数根据需要选择和配置。图2 创建队列参数配置完成后,单击“立即购买”,确认配置信息无误后,单击“提交”完成队列创建。步骤2:创建RDS MySQL数据库和表登录RDS管理控制台,在“实例管理”界面,选择已创建的RDS MySQL实例,选择操作列的“更多 > 登录”,进入数据管理服务实例登录界面。输入实例登录的用户名和密码。单击“登录”,即可进入RDS MySQL数据库并进行管理。在数据库实例界面,单击“新建数据库”,数据库名定义为:testrdsdb,字符集保持默认即可。在已创建的数据库的操作列,单击“SQL查询”,输入以下创建表语句,创建RDS MySQL表。CREATE TABLE mysqlcdc ( `order_id` VARCHAR(64) NOT NULL, `order_channel` VARCHAR(32) NOT NULL, `order_time` VARCHAR(32), `pay_amount` DOUBLE, `real_pay` DOUBLE, `pay_time` VARCHAR(32), `user_id` VARCHAR(32), `user_name` VARCHAR(32), `area_id` VARCHAR(32) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4;步骤3:创建DWS数据库和表参考使用gsql命令行客户端连接DWS集群连接已创建的DWS集群。执行以下命令连接DWS集群的默认数据库“gaussdb”:gsql -d gaussdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -rgaussdb:DWS集群默认数据库。DWS集群连接地址:请参见获取集群连接地址进行获取。如果通过公网地址连接,请指定为集群“公网访问地址”或“公网访问域名”,如果通过内网地址连接,请指定为集群“内网访问地址”或“内网访问域名”。如果通过弹性负载均衡连接,请指定为“弹性负载均衡地址”。dbadmin:创建集群时设置的默认管理员用户名。-W:默认管理员用户的密码。在命令行窗口输入以下命令创建数据库“testdwsdb”。CREATE DATABASE testdwsdb;执行以下命令,退出gaussdb数据库,连接新创建的数据库“testdwsdb”。\q gsql -d testdwsdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -r执行以下命令创建表。create schema test; set current_schema= test; drop table if exists dwsresult; CREATE TABLE dwsresult ( car_id VARCHAR, car_owner VARCHAR, car_age INTEGER , average_speed FLOAT8, total_miles FLOAT8 );步骤4:创建增强型跨源连接创建DLI连接RDS的增强型跨源连接在RDS管理控制台,选择“实例管理”,单击对应的RDS实例名称,进入到RDS的基本信息页面。在“基本信息”的“连接信息”中获取该实例的“内网地址”、“数据库端口”、“虚拟私有云”和“子网”信息,方便后续操作步骤使用。单击“连接信息”中的安全组名称,在“入方向规则”中添加放通队列网段的规则。例如,本示例队列网段为“10.0.0.0/16”,则规则添加为:优先级选为:1,策略选为:允许,协议选择:TCP,端口值不填,类型:IPV4,源地址为:10.0.0.0/16,单击“确定”完成安全组规则添加。登录DLI管理控制台,在左侧导航栏单击“跨源管理”,在跨源管理界面,单击“增强型跨源”,单击“创建”。在增强型跨源创建界面,配置具体的跨源连接参数。具体参考如下。连接名称:设置具体的增强型跨源名称。本示例输入为:dli_rds。弹性资源池:选择步骤1:创建队列中已经创建的队列。虚拟私有云:选择RDS的虚拟私有云。子网:选择RDS的子网。其他参数可以根据需要选择配置。参数配置完成后,单击“确定”完成增强型跨源配置。单击创建的跨源连接名称,查看跨源连接的连接状态,等待连接状态为:“已激活”后可以进行后续步骤。单击“队列管理”,选择操作的队列,本示例为步骤1:创建队列中创建的队列,在操作列,单击“更多 > 测试地址连通性”。在“测试连通性”界面,根据2中获取的RDS连接信息,地址栏输入“RDS内网地址:RDS数据库端口”,单击“测试”测试DLI到RDS网络是否可达。创建DLI连接DWS的增强型跨源连接在DWS管理控制台,选择“集群管理”,单击已创建的DWS集群名称,进入到DWS的基本信息页面。在“基本信息”的“数据库属性”中获取该实例的“内网IP”、“端口”,“基本信息”页面的“网络”中获取“虚拟私有云”和“子网”信息,方便后续操作步骤使用。单击“连接信息”中的安全组名称,在“入方向规则”中添加放通队列网段的规则。例如,本示例队列网段为“10.0.0.0/16”,则规则添加为:优先级选为:1,策略选为:允许,协议选择:TCP,端口值不填,类型:IPV4,源地址为:10.0.0.0/16,单击“确定”完成安全组规则添加。登录DLI管理控制台,在左侧导航栏单击“跨源管理”,在跨源管理界面,单击“增强型跨源”,单击“创建”。说明:本示例默认RDS和DWS实例分别在两个VPC和子网下,所以要分别创建增强型跨源连接打通网络。如果RDS和DWS实例属于同一VPC和子网下,则创建增强型跨源一次即可,4和5不需要再执行。在增强型跨源创建界面,配置具体的跨源连接参数。具体参考如下。连接名称:设置具体的增强型跨源名称。本示例输入为:dli_dws。弹性资源池:选择步骤1:创建队列中已经创建的队列。虚拟私有云:选择DWS的虚拟私有云。子网:选择DWS的子网。其他参数可以根据需要选择配置。参数配置完成后,单击“确定”完成增强型跨源配置。单击创建的跨源连接名称,查看跨源连接的连接状态,等待连接状态为:“已激活”后可以进行后续步骤。单击“队列管理”,选择操作的队列,本示例为步骤1:创建队列中创建的队列,在操作列,单击“更多 > 测试地址连通性”。在“测试连通性”界面,根据2中获取的DWS连接信息,地址栏输入“DWS内网IP:DWS端口”,单击“测试”测试DLI到DWS网络是否可达。步骤5:运行作业在DLI管理控制台,单击“作业管理 > Flink作业”,在Flink作业管理界面,单击“创建作业”。在创建队列界面,类型选择“Flink OpenSource SQL”,名称填写为:FlinkCDCMySQLDWS。单击“确定”,跳转到Flink作业编辑界面。在Flink OpenSource SQL作业编辑界面,配置如下参数。所属队列:选择步骤1:创建队列中创建的队列。Flink版本:选择1.12。保存作业日志:勾选。OBS桶:选择保存作业日志的OBS桶,根据提示进行OBS桶权限授权。开启Checkpoint:勾选。Flink作业编辑框中输入具体的作业SQL,本示例作业参考如下。SQL中加粗的参数需要根据实际情况修改。说明:本示例使用的Flink版本为1.12,故Flink OpenSource SQL语法也是1.12。本示例数据源是Kafka,写入结果数据到Elasticsearch,故请参考Flink OpenSource SQL 1.12创建MySQL CDC源表和Flink OpenSource SQL 1.12创建DWS结果表。create table mysqlCdcSource( order_id string, order_channel string, order_time string, pay_amount double, real_pay double, pay_time string, user_id string, user_name string, area_id STRING ) with ( 'connector' = 'mysql-cdc', 'hostname' = '192.168.12.148',--IP替换为RDS MySQL的实例IP 'port' = '3306',--端口替换为RDS MySQL的实例端口 'username' = 'xxx',--RDS MySQL实例的数据库用户名 'password' = 'xxx',--RDS MySQL实例的数据库用户密码 'database-name' = 'testrdsdb',--RDS MySQL实例的数据库名 'table-name' = 'mysqlcdc'--RDS MySQL实例的数据库下的表名 ); create table dwsSink( order_channel string, pay_amount double, real_pay double, primary key(order_channel) not enforced ) with ( 'connector' = 'gaussdb', 'driver' = 'com.huawei.gauss200.jdbc.Driver', 'url' = 'jdbc:gaussdb://192.168.168.16:8000/testdwsdb', ---192.168.168.16:8000替换为DWS的内网IP和端口,testdwsdb为创建的DWS数据库名 'table-name' = 'test\".\"dwsresult', ---test为创建的DWS表的schema,dwsresult为对应的DWS表名 'username' = 'xxx',--替换为DWS实例的用户名 'password' = 'xxx',--替换为DWS实例的用户密码 'write.mode' = 'insert' ); insert into dwsSink select order_channel, sum(pay_amount),sum(real_pay) from mysqlCdcSource group by order_channel;单击“语义校验”确保SQL语义校验成功。单击“保存”,保存作业。单击“启动”,启动作业,确认作业参数信息,单击“立即启动”开始执行作业。等待作业运行状态变为“运行中”。步骤6:发送数据和查询结果登录RDS管理控制台,在“实例管理”界面,选择已创建的RDS MySQL实例,选择操作列的“更多 > 登录”,进入数据管理服务实例登录界面。输入实例登录的用户名和密码。单击“登录”,即可进入RDS MySQL数据库并进行管理。在已创建的数据库的操作列,单击“SQL查询”,输入以下创建表语句,插入测试数据。insert into mysqlcdc values ('202103241000000001','webShop','2021-03-24 10:00:00','100.00','100.00','2021-03-24 10:02:03','0001','Alice','330106'), ('202103241206060001','appShop','2021-03-24 12:06:06','200.00','180.00','2021-03-24 16:10:06','0002','Jason','330106'), ('202103241403000001','webShop','2021-03-24 14:03:00','300.00','100.00','2021-03-24 10:02:03','0003','Lily','330106'), ('202103241636060001','appShop','2021-03-24 16:36:06','200.00','150.00','2021-03-24 16:10:06','0001','Henry','330106');参考使用gsql命令行客户端连接DWS集群连接已创建的DWS集群。执行以下命令连接DWS集群的默认数据库“testdwsdb”:gsql -d testdwsdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -r执行以下命令,查询DWS的表数据。select * from test.dwsresult;查询结果参考如下:order_channel pay_amount real_pay appShop 400.0 330.0 webShop 400.0 200.0
  • [最佳实践] 创建Flink OpenSource作业从Kafka读取数据写入到DWS
    场景描述该场景为对汽车驾驶的实时数据信息进行分析,将满足特定条件的数据结果进行汇总。数据的输入源为Kafka,结果输出到DWS中。例如,如下样例输入数据:{"car_id":"3027", "car_owner":"lilei", "car_age":"7", "average_speed":"76", "total_miles":"15000"} {"car_id":"3028", "car_owner":"hanmeimei", "car_age":"6", "average_speed":"92", "total_miles":"17000"} {"car_id":"3029", "car_owner":"zhangsan", "car_age":"10", "average_speed":"81", "total_miles":"230000"}预期输出:average_speed <= 90 和 total_miles <= 200000的车辆,即:{"car_id":"3027", "car_owner":"lilei", "car_age":"7", "average_speed":"76", "total_miles":"15000"}前提条件已创建DMS Kafka实例,具体步骤可参考:创建Kafka实例。注意:创建DMS Kafka实例时,不能开启Kafka SASL_SSL。已创建DWS实例,具体创建DWS集群的操作可以参考创建DWS集群。本示例创建的DWS集群版本为:8.1.1.205。整体作业开发流程整体作业开发流程参考图1。图1 作业开发流程步骤1:创建队列:创建DLI作业运行的队列。步骤2:创建Kafka的Topic:创建Kafka生产消费数据的Topic。步骤3:创建DWS数据库和表:创建DWS数据库和表信息。步骤4:创建增强型跨源连接:DLI上创建连接Kafka和DWS的跨源连接,打通网络。步骤5:运行作业:DLI上创建和运行Flink OpenSource作业。步骤6:发送数据和查询结果:Kafka上发送流数据,在RDS上查看运行结果。步骤1:创建队列登录DLI管理控制台,在左侧导航栏单击“资源管理 > 队列管理”,可进入队列管理页面。在队列管理界面,单击界面右上角的“购买队列”。在“购买队列”界面,填写具体的队列配置参数,具体参数填写参考如下。计费模式:选择“包年/包月”或“按需计费”。本示例选择“按需计费”。区域和项目:保持默认值即可。名称:填写具体的队列名称。说明:新建的队列名称,名称只能包含数字、英文字母和下划线,但不能是纯数字,且不能以下划线开头。长度限制:1~128个字符。队列名称不区分大小写,系统会自动转换为小写。类型:队列类型选择“通用队列”。“按需计费”时需要勾选“专属资源模式”。AZ策略、CPU架构、规格:保持默认即可。企业项目:当前选择为“default”。高级选项:选择“自定义”。网段:配置队列网段。例如,当前配置为10.0.0.0/16。注意:队列的网段不能和DMS Kafka、RDS MySQL实例的子网网段有重合,否则后续创建跨源连接会失败。其他参数根据需要选择和配置。图2 创建队列参数配置完成后,单击“立即购买”,确认配置信息无误后,单击“提交”完成队列创建。步骤2:创建Kafka的Topic在Kafka管理控制台,选择“Kafka专享版”,单击对应的Kafka名称,进入到Kafka的基本信息页面。单击“Topic管理 > 创建Topic”,创建一个Topic。Topic配置参数如下:Topic名称。本示例输入为:testkafkatopic。分区数:1。副本数:1其他参数保持默认即可。步骤3:创建DWS数据库和表参考使用gsql命令行客户端连接DWS集群连接已创建的DWS集群。执行以下命令连接DWS集群的默认数据库“gaussdb”:gsql -d gaussdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -rgaussdb:DWS集群默认数据库。DWS集群连接地址:请参见获取集群连接地址进行获取。如果通过公网地址连接,请指定为集群“公网访问地址”或“公网访问域名”,如果通过内网地址连接,请指定为集群“内网访问地址”或“内网访问域名”。如果通过弹性负载均衡连接,请指定为“弹性负载均衡地址”。dbadmin:创建集群时设置的默认管理员用户名。-W:默认管理员用户的密码。在命令行窗口输入以下命令创建数据库“testdwsdb”。CREATE DATABASE testdwsdb;执行以下命令,退出gaussdb数据库,连接新创建的数据库“testdwsdb”。\q gsql -d testdwsdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -r执行以下命令创建表。create schema test; set current_schema= test; drop table if exists qualified_cars; CREATE TABLE qualified_cars ( car_id VARCHAR, car_owner VARCHAR, car_age INTEGER , average_speed FLOAT8, total_miles FLOAT8 );步骤4:创建增强型跨源连接创建DLI连接Kafka的增强型跨源连接在Kafka管理控制台,选择“Kafka专享版”,单击对应的Kafka名称,进入到Kafka的基本信息页面。在“连接信息”中获取该Kafka的“内网连接地址”,在“基本信息”的“网络”中获取获取该实例的“虚拟私有云”和“子网”信息,方便后续操作步骤使用。单击“网络”中的安全组名称,在“入方向规则”中添加放通队列网段的规则。例如,本示例队列网段为“10.0.0.0/16”,则规则添加为:优先级选为:1,策略选为:允许,协议选择:TCP,端口值不填,类型:IPV4,源地址为:10.0.0.0/16,单击“确定”完成安全组规则添加。登录DLI管理控制台,在左侧导航栏单击“跨源管理”,在跨源管理界面,单击“增强型跨源”,单击“创建”。在增强型跨源创建界面,配置具体的跨源连接参数。具体参考如下。连接名称:设置具体的增强型跨源名称。本示例输入为:dli_kafka。弹性资源池:选择步骤1:创建队列中已经创建的队列名。虚拟私有云:选择Kafka的虚拟私有云。子网:选择Kafka的子网。其他参数可以根据需要选择配置。参数配置完成后,单击“确定”完成增强型跨源配置。单击创建的跨源连接名称,查看跨源连接的连接状态,等待连接状态为:“已激活”后可以进行后续步骤。单击“队列管理”,选择操作的队列,本示例为步骤1:创建队列中创建的队列,在操作列,单击“更多 > 测试地址连通性”。在“测试连通性”界面,根据2中获取的Kafka连接信息,地址栏输入“Kafka内网地址:Kafka数据库端口”,单击“测试”测试DLI到Kafka网络是否可达。创建DLI连接DWS的增强型跨源连接在DWS管理控制台,选择“集群管理”,单击已创建的DWS集群名称,进入到DWS的基本信息页面。在“基本信息”的“数据库属性”中获取该实例的“内网IP”、“端口”,“基本信息”页面的“网络”中获取“虚拟私有云”和“子网”信息,方便后续操作步骤使用。单击“连接信息”中的安全组名称,在“入方向规则”中添加放通队列网段的规则。例如,本示例队列网段为“10.0.0.0/16”,则规则添加为:优先级选为:1,策略选为:允许,协议选择:TCP,端口值不填,类型:IPV4,源地址为:10.0.0.0/16,单击“确定”完成安全组规则添加。登录DLI管理控制台,在左侧导航栏单击“跨源管理”,在跨源管理界面,单击“增强型跨源”,单击“创建”。说明:本示例默认Kafka和DWS实例分别在两个VPC和子网下,所以要分别创建增强型跨源连接打通网络。如果Kafka和DWS实例属于同一VPC和子网下,则创建增强型跨源一次即可,4和5不需要再执行。在增强型跨源创建界面,配置具体的跨源连接参数。具体参考如下。连接名称:设置具体的增强型跨源名称。本示例输入为:dli_dws。弹性资源池:选择步骤1:创建队列中已经创建的队列名。虚拟私有云:选择DWS的虚拟私有云。子网:选择DWS的子网。其他参数可以根据需要选择配置。参数配置完成后,单击“确定”完成增强型跨源配置。单击创建的跨源连接名称,查看跨源连接的连接状态,等待连接状态为:“已激活”后可以进行后续步骤。单击“队列管理”,选择操作的队列,本示例为步骤1:创建队列中创建的队列,在操作列,单击“更多 > 测试地址连通性”。在“测试连通性”界面,根据2中获取的DWS连接信息,地址栏输入“DWS内网IP:DWS端口”,单击“测试”测试DLI到DWS网络是否可达。步骤5:运行作业在DLI管理控制台,单击“作业管理 > Flink作业”,在Flink作业管理界面,单击“创建作业”。在创建队列界面,类型选择“Flink OpenSource SQL”,名称填写为:FlinkKafkaDWS。单击“确定”,跳转到Flink作业编辑界面。在Flink OpenSource SQL作业编辑界面,配置如下参数。所属队列:选择步骤1:创建队列中创建的队列。Flink版本:选择1.12。保存作业日志:勾选。OBS桶:选择保存作业日志的OBS桶,根据提示进行OBS桶权限授权。开启Checkpoint:勾选。Flink作业编辑框中输入具体的作业SQL,本示例作业参考如下。SQL中加粗的参数需要根据实际情况修改。说明:本示例使用的Flink版本为1.12,故Flink OpenSource SQL语法也是1.12。本示例数据源是Kafka,写入结果数据到DWS,故请参考Flink OpenSource SQL 1.12创建Kafka源表和Flink OpenSource SQL 1.12创建DWS结果表(RDS连接)。create table car_infos( car_id STRING, car_owner STRING, car_age INT, average_speed DOUBLE, total_miles DOUBLE ) with ( "connector" = "kafka", "properties.bootstrap.servers" = "10.128.0.120:9092,10.128.0.89:9092,10.128.0.83:9092",--替换为kafka的内网连接地址和端口 "properties.group.id" = "click", "topic" = "testkafkatopic",--创建的Kafka的Topic "format" = "json", "scan.startup.mode" = "latest-offset" ); create table qualified_cars ( car_id STRING, car_owner STRING, car_age INT, average_speed DOUBLE, total_miles DOUBLE ) WITH ( 'connector' = 'gaussdb', 'driver' = 'com.huawei.gauss200.jdbc.Driver', 'url' = 'jdbc:gaussdb://192.168.168.16:8000/testdwsdb', ---192.168.168.16:8000替换为DWS的内网IP和端口,testdwsdb为创建的DWS数据库名 'table-name' = 'test\".\"qualified_cars', ---test为创建的DWS表的schema,qualified_cars为对应的DWS表名 'username' = 'xxxx',--替换为DWS实例的用户名 'password' = 'xxxx',--替换为DWS实例的用户密码 'write.mode' = 'insert' ); /** 将合格车辆信息输出 **/ INSERT INTO qualified_cars SELECT * FROM car_infos where average_speed <= 90 and total_miles <= 200000;单击“语义校验”确保SQL语义校验成功。单击“保存”,保存作业。单击“启动”,启动作业,确认作业参数信息,单击“立即启动”开始执行作业。等待作业运行状态变为“运行中”。步骤6:发送数据和查询结果使用Kafka客户端向步骤2:创建Kafka的Topic中的Topic发送数据,模拟实时数据流。Kafka生产和发送数据的方法请参考:DMS - 连接实例生产消费信息。发送样例数据如下:{"car_id":"3027", "car_owner":"lilei", "car_age":"7", "average_speed":"76", "total_miles":"15000"} {"car_id":"3028", "car_owner":"hanmeimei", "car_age":"6", "average_speed":"92", "total_miles":"17000"} {"car_id":"3029", "car_owner":"zhangsan", "car_age":"10", "average_speed":"81", "total_miles":"230000"}参考使用gsql命令行客户端连接DWS集群连接已创建的DWS集群。执行以下命令连接DWS集群的默认数据库“testdwsdb”:gsql -d testdwsdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -r查询DWS的表数据。select * from test.qualified_cars;查询结果参考如下:car_id car_owner car_age average_speed total_miles 3027 lilei 7 76.0 15000.0
  • [最佳实践] 迁移DWS数据至DLI
    本文为您介绍如何通过CDM数据同步功能,迁移数据仓库服务DWS数据至DLI。前提条件已创建DLI的SQL队列。创建DLI队列的操作可以参考创建DLI队列。注意:创建DLI队列时队列类型需要选择为“SQL队列”。已创建数据仓库服务DWS集群。具体创建DWS集群的操作可以参考创建DWS集群。本示例创建的DWS集群版本为:8.1.1.205。已创建CDM迁移集群。创建CDM集群的操作可以参考创建CDM集群。说明:如果目标数据源为云下的数据库,则需要通过公网或者专线打通网络。通过公网互通时,需确保CDM集群已绑定EIP、CDM云上安全组出方向放通云下数据源所在的主机、数据源所在的主机可以访问公网且防火墙规则已开放连接端口。数据源为云上的DWS、MRS等服务时,网络互通需满足如下条件:i. CDM集群与云上服务处于不同区域的情况下,需要通过公网或者专线打通网络。通过公网互通时,需确保CDM集群已绑定EIP,数据源所在的主机可以访问公网且防火墙规则已开放连接端口。ii. CDM集群与云上服务同区域情况下,同虚拟私有云、同子网、同安全组的不同实例默认网络互通;如果同虚拟私有云但是子网或安全组不同,还需配置路由规则及安全组规则。配置路由规则请参见如何配置路由规则章节,配置安全组规则请参见如何配置安全组规则章节。iii. 此外,您还必须确保该云服务的实例与CDM集群所属的企业项目必须相同,如果不同,需要修改工作空间的企业项目。本示例CDM集群的虚拟私有云、子网以及安全组和DWS集群保持一致。步骤一:数据准备DWS集群上创建数据库和表。参考使用gsql命令行客户端连接DWS集群连接已创建的DWS集群。执行以下命令连接DWS集群的默认数据库“gaussdb”:gsql -d gaussdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -rgaussdb:DWS集群默认数据库。DWS集群连接地址:请参见获取集群连接地址进行获取。如果通过公网地址连接,请指定为集群“公网访问地址”或“公网访问域名”,如果通过内网地址连接,请指定为集群“内网访问地址”或“内网访问域名”。如果通过弹性负载均衡连接,请指定为“弹性负载均衡地址”。dbadmin:创建集群时设置的默认管理员用户名。-W:默认管理员用户的密码。在命令行窗口输入以下命令创建数据库“testdwsdb”。CREATE DATABASE testdwsdb;执行以下命令,退出gaussdb数据库,连接新创建的数据库“testdwsdb”。\q gsql -d testdwsdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -r执行以下命令创建表并插入数据。创建表:CREATE TABLE table1(id int, a char(6), b varchar(6),c varchar(6)) ;插入表数据:INSERT INTO table1 VALUES(1,'123','456','789'); INSERT INTO table1 VALUES(2,'abc','efg','hif');查询表数据确认数据插入成功。select * from table1;图1 查询表数据在DLI上创建数据库和表。登录DLI管理控制台,选择“SQL编辑器”,在SQL编辑器中“执行引擎”选择“spark”,“队列”选择已创建的SQL队列。在编辑器中输入以下语句创建数据库,例如当前创建迁移后的DLI数据库testdb。详细的DLI创建数据库的语法可以参考创建DLI数据库。create database testdb;在“SQL编辑器”中,数据库选择“testdb”,执行以下建表语句创建数据库下的表。详细的DLI建表语法可以参考创建DLI表。create table tabletest(id INT, name1 string, name2 string, name3 string);步骤二:数据迁移配置CDM数据源连接。创建源端DWS数据库的连接。登录CDM控制台,选择“集群管理”,选择已创建的CDM集群,在操作列选择“作业管理”。在作业管理界面,选择“连接管理”,单击“新建连接”,连接器类型选择“数据仓库服务(DWS)”,单击“下一步”。配置连接DWS的数据源连接参数,具体参数配置如下。表1 DWS数据源配置参数值名称自定义DWS数据源名称。例如当前配置为:source_dws。数据库服务器单击输入框旁边的“选择”按钮,选择当前已创建的DWS集群名称。端口DWS数据库的端口,默认为:8000。数据库名称当前需要迁移的DWS数据库名称。当前示例为DWS集群上创建数据库和表中创建的数据库“testdwsdb”。用户名待连接数据库的用户。该数据库用户需要有数据表的读写权限,以及对元数据的读取权限。本示例使用创建DWS数据库实例的默认管理员用户“dbadmin”。密码对应的DWS数据库用户的密码。图2 CDM配置DWS数据源其他更多参数保持默认即可,如果需要了解更多参数说明,可以参考配置关系数据库连接。单击“保存”完成DWS数据源连接配置。创建目的端DLI数据源的连接。登录CDM控制台,选择“集群管理”,选择已创建的CDM集群,在操作列选择“作业管理”。在作业管理界面,选择“连接管理”,单击“新建连接”,连接器类型选择“数据湖探索(DLI)”,单击“下一步”。图3 创建DLI数据源连接配置目的端DLI数据源连接。具体参数配置可以参考在CDM上配置DLI连接。图4 创建DLI数据源连接配置完成后,单击“保存”完成DLI数据源配置。创建CDM迁移作业。登录CDM控制台,选择“集群管理”,选择已创建的CDM集群,在操作列选择“作业管理”。在“作业管理”界面,选择“表/文件迁移”,单击“新建作业”。在新建作业界面,配置当前作业配置信息,具体参数参考如下:图5 CDM数据迁移作业配置作业名称:自定义数据迁移的作业名称。例如,当前定义为:test。源端作业配置,具体参考如下:表2 源端作业配置参数名参数值源连接名称选择1.a中已创建的数据源名称。使用SQL语句“使用SQL语句”选择“是”时,您可以在这里输入自定义的SQL语句,CDM将根据该语句导出数据。本示例当前选择为“否”。模式或表空间“使用SQL语句”选择“否”时,显示该参数,表示待抽取数据的模式或表空间名称。单击输入框后面的按钮可进入模式选择界面,用户也可以直接输入模式或表空间名称。本示例因为DWS集群上创建数据库和表中没有创建SCHEMA,则本参数为默认的“public”。如果选择界面没有待选择的模式或表空间,请确认对应连接里的帐号是否有元数据查询的权限。说明:说明:该参数支持配置通配符(*),实现导出以某一前缀开头或者以某一后缀结尾的所有数据库。例如:SCHEMA*表示导出所有以“SCHEMA”开头的数据库。*SCHEMA表示导出所有以“SCHEMA”结尾的数据库。*SCHEMA*表示数据库名称中只要有“SCHEMA”字符串,就全部导出。表名待迁移的DWS数据表名。当前为DWS集群上创建数据库和表中的“table1”表。更多详细参数配置请参考配置关系数据库源端参数。目的端作业参数配置,具体参考如下:表3 目的端作业配置参数名参数值目的连接名称选择已创建的DLI数据源连接。资源队列选择已创建的DLI SQL类型的队列。数据库名称选择DLI下已创建的数据库。当前示例为在DLI上创建数据库和表创建的数据库名,即为“testdb”。表名选择DLI下已创建的表名。当前示例为在DLI上创建数据库和表创建的表名,即为“tabletest”。导入前清空数据选择导入前是否清空目的表的数据。当前示例选择为“否”。如果设置为是,任务启动前会清除目标表中数据。详细的参数配置可以参考:CDM配置DLI目的端参数。单击“下一步”,进入到字段映射界面,CDM会自动匹配源和目的字段。如果字段映射顺序不匹配,可通过拖拽字段调整。如果选择在目的端自动创建类型,这里还需要配置每个类型的字段类型、字段名称。CDM支持迁移过程中转换字段内容,详细请参见字段转换。图6 字段映射单击“下一步”配置任务参数,一般情况下全部保持默认即可。该步骤用户可以配置如下可选功能:作业失败重试:如果作业执行失败,可选择是否自动重试,这里保持默认值“不重试”。作业分组:选择作业所属的分组,默认分组为“DEFAULT”。在CDM“作业管理”界面,支持作业分组显示、按组批量启动作业、按分组导出作业等操作。是否定时执行:如果需要配置作业定时自动执行,请参见配置定时任务。这里保持默认值“否”。抽取并发数:设置同时执行的抽取任务数。这里保持默认值“1”。是否写入脏数据:如果需要将作业执行过程中处理失败的数据、或者被清洗过滤掉的数据写入OBS中,以便后面查看,可通过该参数配置,写入脏数据前需要先配置好OBS连接。这里保持默认值“否”即可,不记录脏数据。单击“保存并运行”,回到作业管理界面,在作业管理界面可查看作业执行进度和结果。图7 迁移作业进度和结果查询步骤三:结果查询CDM迁移作业运行完成后,再登录到DLI管理控制台,选择“SQL编辑器”,在SQL编辑器中“执行引擎”选择“spark”,“队列”选择已创建的SQL队列,数据库选择在DLI上创建数据库和表中已创建的数据库,执行DLI表查询语句,查询DWS表数据是否已成功迁移到DLI的“tabletest”表中。select * from tabletest;图8 查询DLI表数据
  • [知识分享] 10个常见触发IO瓶颈的高频业务场景
    >摘要:本文从应用业务优化角度,以常见触发IO慢的业务SQL场景为例,指导如何通过优化业务去提升IO效率和降低IO。 本文分享自华为云社区《[GaussDB(DWS)性能优化之业务降IO优化](https://bbs.huaweicloud.com/blogs/351796?utm_source=csdn&utm_medium=bbs-ex&utm_campaign=other&utm_content=content)》,作者:along_2020。 IO高?业务慢?在DWS实际业务场景中因IO高、IO瓶颈导致的性能问题非常多,其中应用业务设计不合理导致的问题占大多数。本文从应用业务优化角度,以常见触发IO慢的业务SQL场景为例,指导如何通过优化业务去提升IO效率和降低IO。 说明 :因磁盘故障(如慢盘)、raid卡读写策略(如Write Through)、集群主备不均等非应用业务原因导致的IO高不在本次讨论。 # 一、确定IO瓶颈&识别高IO的语句 ## 1、查等待视图确定IO瓶颈 ``` SELECT wait_status,wait_event,count(*) AS cnt FROM pgxc_thread_wait_status WHERE wait_status 'wait cmd' AND wait_status 'synchronize quit' AND wait_status 'none' GROUP BY 1,2 ORDER BY 3 DESC limit 50; ``` IO瓶颈时常见等待状态如下: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835298790314932.png) ## 2、抓取高IO消耗的SQL 主要思路为先通过OS命令识别消耗高的线程,然后结合DWS的线程号信息找到消耗高的业务SQL,具体方法参见附件中iowatcher.py脚本和README使用介绍 ## 3、SQL级IO问题分析基础 在抓取到消耗IO高的业务SQL后怎么分析?主要掌握以下两点基础知识: 1)PGXC_THREAD_WAIT_STATUS视图功能,详细介绍参见: [PGXC_THREAD_WAIT_STATUS_数据仓库服务 GaussDB(DWS)_开发指南(8.1.0)_系统表和系统视图_系统视图_华为云](https://support.huaweicloud.com/devg2-dws/dws_0402_0892.html) 2)EXPLAIN功能,至少需掌握的知识点有Scan算子、A-time、A-rows、E- rows,详细介绍参见: [GaussDB(DWS)性能调优系列基础篇二:大道至简explain分布式计划-云社区-华为云](https://bbs.huaweicloud.com/blogs/197945) # 二、常见触发IO瓶颈的高频业务场景 ## 场景1:列存小CU膨胀 某业务SQL查询出390871条数据需43248ms,分析计划主要耗时在Cstore Scan ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835367872429035.png) Cstore Scan的详细信息中,每个DN扫描出2w左右的数据,但是扫描了有数据的CU(CUSome) 155079个,没有数据的CU(CUNone) 156375个,说明当前小CU、未命中数据的CU极多,也即CU膨胀严重。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835376385705944.png) 触发因素:对列存表(分区表尤甚)进行高频小批量导入会造成CU膨胀 处理方法: 1、列存表的数据入库方式修改为攒批入库,单分区单批次入库数据量大于DN个数*6W为宜 2、如果确因业务原因无法攒批,则考虑次选方案,定期VACUUM FULL此类高频小批量导入的列存表。 3、当小CU膨胀很快时,频繁VACUUM FULL也会消耗大量IO,甚至加剧整个系统的IO瓶颈,这时需考虑整改为行存表(CU长期膨胀严重的情况下,列存的存储空间优势和顺序扫描性能优势将不复存在)。 ## 场景2:脏数据&数据清理 某SQL总执行时间2.519s,其中Scan占了2.516s,同时该表的扫描最终只扫描到0条符合条件数据,过滤了20480条数据,也即总共扫描了20480+0条数据却消耗了2s+,这种扫描时间与扫描数据量严重不符的情况,基本就是脏数据多影响扫描和IO效率。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835394320723349.png) 查看表脏页率为99%,Vacuum Full后性能优化到100ms左右 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835401320889032.png) 触发因素:表频繁执行update/delete导致脏数据过多,且长时间未VACUUM FULL清理 处理方法: - 对频繁update/delete产生脏数据的表,定期VACUUM FULL,因大表的VACUUM FULL也会消耗大量IO,因此需要在业务低峰时执行,避免加剧业务高峰期IO压力。 - 当脏数据产生很快,频繁VACUUM FULL也会消耗大量IO,甚至加剧整个系统的IO瓶颈,这时需要考虑脏数据的产生是否合理。针对频繁delete的场景,可以考虑如下方案:1)全量delete修改为truncate或者使用临时表替代 2)定期delete某时间段数据,设计成分区表并使用truncate&drop分区替代 ## 场景3:表存储倾斜 例如表Scan的A-time中,max time dn执行耗时6554ms,min time dn耗时0s,dn之间扫描差异超过10倍以上,这种集合Scan的详细信息,基本可以确定为表存储倾斜导致 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835422845773048.png) 通过table_distribution发现所有数据倾斜到了dn_6009单个dn,修改分布列使的表存储分布均匀后,max dn time和min dn time基本维持在相同水平400ms左右,Scan时间从6554ms优化到431ms。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835431228454951.png) 触发因素:分布式场景,表分布列选择不合理会导致存储倾斜,同时导致DN间压力失衡,单DN IO压力大,整体IO效率下降。 解决办法:修改表的分布列使表的存储分布均匀,分布列选择原则参《GaussDB 8.x.x 产品文档》中“表设计最佳实践”之“选择分布列章节”。 ## 场景4:无索引、有索引不走 例如某点查询,Seq Scan扫描需要3767ms,因涉及从4096000条数据中获取8240条数据,符合索引扫描的场景(海量数据中寻找少量数据),在对过滤条件列增加索引后,计划依然是Seq Scan而没有走Index Scan。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835445289839263.png) 对目标表analyze后,计划能够自动选择索引,性能从3s+优化到2ms+,极大降低IO消耗 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835451747933783.png) 常见场景:行存大表的查询场景,从大量数据中访问极少数据,没走索引扫描而是走顺序扫描,导致IO效率低,不走索引常见有两种情况: - 过滤条件列上没建索引 - 有索引但是计划没选索引扫描 触发因素: - 常用过滤条件列没有建索引 - 表中数据因DML产生数据特征变化后未及时ANALYZE导致优化器无法选择索引扫描计划,ANALYZE介绍[参见GaussDB(DWS)性能调优系列基础篇一:万物之始analyze统计信息-云社区-华为云](https://bbs.huaweicloud.com/blogs/192029) 处理方式: 1、对行存表常用过滤列增加索引,索引基本设计原则: - 索引列选择distinct值多,且常用于过滤条件,过滤条件多时可以考虑建组合索引,组合索引中distinct值多的列排在前面,索引个数不宜超过3个 - 大量数据带索引导入会产生大量IO,如果该表涉及大量数据导入,需严格控制索引个数,建议导入前先将索引删除,导数完毕后再重新建索引; 2、对频繁做DML操作的表,业务中加入及时ANALYZE,主要场景: - 表数据从无到有 - 表频繁进行INSERT/UPDATE/DELETE - 表数据即插即用,需要立即访问且只访问刚插入的数据 ## 场景5:无分区、有分区不剪枝 例如某业务表进场使用createtime时间列作为过滤条件获取特定时间数据,对该表设计为分区表后没有走分区剪枝(Selected Partitions数量多),Scan花了701785ms,IO效率极低。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835521707639495.png) 在增加分区键creattime作为过滤条件后,Partitioned scan走分区剪枝(Selected Partitions数量极少),性能从700s优化到10s,IO效率极大提升。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835529685175555.png) 常见场景:按照时间存储数据的大表,查询特征大多为访问当天或者某几天的数据,这种情况应该通过分区键进行分区剪枝(只扫描对应少量分区)来极大提升IO效率,不走分区剪枝常见的情况有: - 未设计成分区表 - 设计了分区没使用分区键做过滤条件 - 分区键做过滤条件时,对列值有函数转换 触发因素:未合理使用分区表和分区剪枝功能,导致扫描效率低 处理方式: - 对按照时间特征存储和访问的大表设计成分区表 - 分区键一般选离散度高、常用于查询filter条件中的时间类型的字段 - 分区间隔一般参考高频的查询所使用的间隔,需要注意的是针对列存表,分区间隔过小(例如按小时)可能会导致小文件过多的问题,一般建议最小间隔为按天。 ## 场景6:行存表求count值 例如某行存大表频繁全表count(指不带filter条件或者filter条件过滤很少数据的count),其中Scan花费43s,持续占用大量IO,此类作业并发起来后,整体系统IO持续100%,触发IO瓶颈,导致整体性能慢。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835559536792396.png) 对比相同数据量的列存表(A-rows均为40960000),列存的Scan只花费14ms,IO占用极低 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835566265451401.png) 触发因素:行存表因其存储方式的原因,全表scan的效率较低,频繁的大表全表扫描,导致IO持续占用。 解决办法: - 业务侧审视频繁全表count的必要性,降低全表count的频率和并发度 - 如果业务类型符合列存表,则将行存表修改为列存表,提高IO效率 ## 场景7:行存表求max值 例如求某行存表某列的max值,花费了26772ms,此类作业并发起来后,整体系统IO持续100%,触发IO瓶颈,导致整体性能慢。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835584403273527.png) 针对max列增加索引后,语句耗时从26s优化到32ms,极大减少IO消耗 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835590660680610.png) 触发因素:行存表max值逐个scan符合条件的值来计算max,当scan的数据量很大时,会持续消耗IO 解决办法:给max列增加索引,依靠btree索引天然有序的特征,加速扫描过程,降低IO消耗。 ## 场景8:大量数据带索引导入 某客户场景数据往DWS同步时,延迟严重,集群整体IO压力大。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835610449230701.png) 后台查看等待视图有大量wait wal sync和WALWriteLock状态,均为xlog同步状态 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835618475829770.png) 触发因素:大量数据带索引(一般超过3个)导入(insert/copy/merge into)会产生大量xlog,导致主备同步慢,备机长期Catchup,整体IO利用率飙高。历史案例参考:[GaussDB(DWS)实例长期处于catchup问题分析-云社区-华为云](https://bbs.huaweicloud.com/blogs/242269) 解决方案: - 严格控制每张表的索引个数,建议3个以内 - 大量数据导入前先将索引删除,导数完毕后再重新建索引; ## 场景9:行存大表首次查询 某客户场景出现备DN持续Catcup,IO压力大,观察某个sql等待视图在wait wal sync ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835654821710446.png) 排查业务发现某查询语句执行时间较长,kill后恢复 触发因素:行存表大量数据入库后,首次查询触发page hint产生大量XLOG,触发主备同步慢及大量IO消耗。 解决措施: - 对该类一次性访问大量新数据的场景,修改为列存表 - 关闭wal_log_hints和enable_crc_check参数(故障期间有丢数风险,不推荐) ## 场景10:小文件多IOPS高 某业务现场一批业务起来后,整个集群IOPS飙高,另外当出现集群故障后,长期building不完,IOPS飙高,相关表信息如下: ``` SELECT relname,reloptions,partcount FROM pg_class c INNER JOIN ( SELECT parented,count(*) AS partcount FROM pg_partition GROUP BY parentid ) s ON c.oid = s.parentid ORDER BY partcount DESC; ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/10/1654835684251113526.png) 触发因素:某业务库大量列存多分区(3000+)的表,导致小文件巨多(单DN文件2000w+),访问效率低,故障恢复Building极慢,同时building也消耗大量IOPS,发向影响业务性能。 解决办法: - 整改列存分区间隔,减少分区个数来降低文件个数 - 列存表修改为行存表,行存的存储特征决定其文件个数不会像列存那么膨胀严重 # 三、小结 经过前面案例,稍微总结下不难发现,提升IO使用效率概括起来可分为两个维度,即提升IO的存储效率和计算效率(又称访问效率),提升存储效率包括整合小CU、减少脏数据、消除存储倾斜等,提升计算效率包括分区剪枝、索引扫描等,大家根据实际场景灵活处理即可。
总条数:2746 到第 页
上滑加载中