-
一、前言GaussDB是一款基于云计算技术的高性能关系型数据库,支持多种数据模型和分布式架构。在GaussDB中,视图管理是非常重要的一项功能,它可以帮助用户更方便地管理和查询数据。数据库视图管理是指对数据库中的视图进行创建、修改、删除、查询等操作的过程。二、准备条件参考上一篇文章《GaussDB云数据库SQL应用系列-基础使用》1、登录华为云数据库GaussDB2、选择对应实例并进入到SQL执行界面三、视图语法及参数1、CREATE VIEW语法格式CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW view_name [ ( column_name [, ...] ) ][ WITH ( {view_option_name [= view_option_value]} [, ... ] ) ]AS query;【参数说明】OR REPLACE:如果视图已存在,则重新定义。TEMP | TEMPORARY:创建临时视图。view_name:要创建的视图名称。可以用模式修饰。column_name:可选的名称列表,用作视图的字段名。如果没有给出,字段名取自查询中的字段名。view_option_name [= view_option_value]:该子句为视图指定一个可选的参数。目前view_option_name支持的参数仅有security_barrier,当VIEW试图提供行级安全时,应使用该参数。Query:为视图提供行和列的SELECT或VALUES语句。2、DROP VIEW语法格式DROP VIEW [ IF EXISTS ] view_name [, ...] [ CASCADE | RESTRICT ];【参数说明】IF EXISTS:如果指定的视图不存在,则发出一个notice而不是抛出一个错误。view_name:要删除的视图名称。CASCADE | RESTRICT:CASCADE:级联删除依赖此视图的对象(比如其他视图)。RESTRICT:如果有依赖对象存在,则拒绝删除此视图。此选项为缺省值。四、操作示例在数据库中,视图管理通常需要使用SQL语句来进行操作1、创建基础表1)创建一张订单表,其中包含字段:订单编号、订单日期、供货商编号、商品编号、商品名称、商品产地、商品数量、商品进价。--删除表 order_infoDROP TABLE IF EXISTS order_info;--创建表 order_infoCREATE TABLE order_info(order_id int PRIMARY KEY,order_date date not null,supplier_id int not null,goods_id char(20) not null,goods_name char(20) not null,goods_home varchar(100) not null,goods_number int not null,goods_amount int not null);2)创建一张销售信息表,其中包含字段:销售编号、销售日期、商品编号、商品名称、商品数量、商品售价。--删除表 sell_list_infoDROP TABLE IF EXISTS sell_list_info;--创建表 sell_list_infoCREATE TABLE sell_list_info(sell_id int PRIMARY KEY,sell_date date not null,goods_id char(20) not null,goods_name char(20) not null,goods_number int not null,sell_goods_amount int not null);3)创建一张商品信息管理表,其中字段包括:商品编号、商品条形码、商品名称、商品产地、商品存量、商品进价、商品售价、供应商编号、仓库编号。--删除表 goods_infoDROP TABLE IF EXISTS goods_info;--创建表 goods_infoCREATE TABLE goods_info(goods_id char(20) PRIMARY KEY,goods_code varchar(50) not null,goods_name char(20) not null,goods_home varchar(100) not null,goods_number int not null,purchase_goods_amount int not null,sell_goods_amount int not null,supplier_id int not null,warehouse_id int not null);2、设置视图应用场景示例一,方便数据分析视图可以用于对数据进行聚合、分组和筛选等操作,从而方便数据分析和报告生成。场景:依据订单表,按商品名称及订货日期统计商品总数和总价、平均价格。--删除视图DROP VIEW IF EXISTS order_info_view;--依据订单表,按商品名称及订货日期统计商品总数和总价、平均价格。CREATE VIEW order_info_viewASSELECT goods_name,order_date,SUM(goods_number) AS total_number,SUM(goods_number * goods_amount) AS total_amount,AVG(goods_amount) AS avg_amountFROM order_infoGROUP BY goods_name, order_date;示例二,生成月度、年度报表场景:依据销售表,按年度统计所有销售商品的销售总数量和总销售额,以及其对应的仓库编号和供应商编号。--删除视图DROP VIEW IF EXISTS sell_list_sum_view;--依据销售表,按年度统计所有销售商品的销售总数量和总销售额,以及其对应的仓库编号和供应商编号。CREATE VIEW sell_list_sum_viewASSELECT t1.goods_id,t1.goods_name,t1.s_year,t1.total_number,t1.total_amount,t2.supplier_id,t2.warehouse_idFROM(SELECT goods_id,EXTRACT(YEAR FROM sell_date) AS s_year,goods_name,SUM(goods_number) AS total_number,SUM(goods_number * sell_goods_amount) AS total_amountFROM sell_list_infoGROUP BY goods_id,EXTRACT(YEAR FROM sell_date),goods_name) t1LEFT JOIN(SELECT goods_id,supplier_id,warehouse_idFROM goods_info) t2ON t1.goods_id =t2.goods_id示例三,实现数据安全在某些情况下,应用程序需要对数据进行访问控制,例如只允许特定的用户或角色访问某些数据。使用视图可以轻松实现这种控制。场景:只允许某个用户或角色访问某些数据(指定列),例如,只给用户zhangsan 访问“商品信息管理表(无此表访问权限)”的字段“商品名称、商品产地、商品存量、商品售价”。通过创建视图,并赋予zhangsan访问此视图的权限--删除视图DROP VIEW IF EXISTS goods_info_view;--只允许某个用户或角色访问某些数据(指定列)--例如,给用户zhangsan 访问“商品信息管理表(无此表访问权限)”的字段“商品名称、商品存量、商品售价”。--赋予zhangsan访问此视图的权限CREATE VIEW goods_info_viewASSELECT goods_name,goods_number,sell_goods_amountFROM goods_info;--赋予zhangsan查询权限GRANT SELECT ON goods_info_VIEW TO zhangsan;示例四,简化复杂的查询当需要对多个表进行联合查询时,可以使用视图来将这些表组合成一个单一的查询结果集,从而简化查询过程。场景:基于上一篇文章中的学生课程成绩表,生成一张视图:获取学生的姓名、课程、成绩、代课老师的信息汇总数据--删除视图DROP VIEW IF EXISTS student_c_view;--基于上一篇文章中的学生课程成绩表,生成一张视图:获取学生的姓名、课程、成绩、代课老师的信息汇总数据CREATE VIEW student_c_viewASSELECT t2.sname,t3.cname,t1.scgrade,t3.cteacherFROM(SELECT sno,cno,scgradeFROM sc) t1LEFT JOIN students t2ON t1.sno=t2.snoleft join course t3ON t1.cno=t3.cno--查看结果SELECT * FROM student_c_view;五、小结数据库视图是一种虚拟表,它是由一个查询语句定义的。视图可以看作是对数据集合的逻辑重组,用户可以通过视图来访问这些数据,而不必关心数据的存储方式和位置。GaussDB提供了灵活的视图管理功能,包括创建(CREATE)、修改(OR REPLACE)、删除 (DROP)和查询(SELEC)视图等操作。视图是一种虚拟的表,它由一个或多个基本表的数据经过逻辑运算后得到。它可以简化复杂的数据结构,提高查询效率,同时也可以隐藏基本表的细节,用户可以根据自己的需求选择不同的视图类型和定义视图的列,以满足不同的数据分析和查询需求。同时,GaussDB还支持对视图进行权限控制,以保证数据的安全性和隐私性。——结束
-
HDC.Cloud大会可以了解各行各业的新技术和未来发展趋势,倾听业界各行各业大咖的精彩演讲,大家对HDC大会有哪些感受和期待?欢迎表达出来
-
分布式数据库的优势,就是利用多DN的资源进行并行计算,提高吞吐量。但有些SQL在这些方面不够注意,导致执行过程中由于全局性操作仅能在一个DN或CN上执行,造成了性能瓶颈。不能下推即属于这一类型问题。权限种类及对象列表https://bbs.huaweicloud.com/forum/thread-0299151499725735002-1-1.html权限管理https://bbs.huaweicloud.com/forum/thread-0236151499871507003-1-1.html业务用户权限https://bbs.huaweicloud.com/forum/thread-02120151500033853002-1-1.htmlRoach备份恢复基本框架https://bbs.huaweicloud.com/forum/thread-0204151500205536002-1-1.html逻辑备份的原理https://bbs.huaweicloud.com/forum/thread-0236151500300486004-1-1.html并行计算技术解密https://bbs.huaweicloud.com/forum/thread-0236151500438056005-1-1.html参数query_dophttps://bbs.huaweicloud.com/forum/thread-0272151500607641002-1-1.html数据一致性比对解决方案https://bbs.huaweicloud.com/forum/thread-0269151500725368001-1-1.html默认权限实现共享schemahttps://bbs.huaweicloud.com/forum/thread-0299151502129534003-1-1.html怎么创建索引和表结构https://bbs.huaweicloud.com/forum/thread-0204151502371252003-1-1.html创建分区表https://bbs.huaweicloud.com/forum/thread-02119151502600115002-1-1.html怎么选择数据类型https://bbs.huaweicloud.com/forum/thread-02120151502661117004-1-1.htmlsql开发经验总结https://bbs.huaweicloud.com/forum/thread-0269151502688654002-1-1.htmlpooler连接池https://bbs.huaweicloud.com/forum/thread-02119151502897139003-1-1.htmlpooler建连报错https://bbs.huaweicloud.com/forum/thread-0272151503148367004-1-1.html
-
常见的连接报错例如: 5e16eab1.7933 test_1226 281467863168624 gsql 0 cn_5001 08006 72620544030096250 [BACKEND] ERROR: pooler: failed to create connections in parallel mode for thread 281467863168624, Error Message: pooler: failed to connect to dn_6009_6010:wait 172.31.17.4:45138:dn_6009_6010 timeout expired从日志中可以得到几个关键信息:query_id(72620544030096250):用于查找相关query的日志,query_id全局唯一,用于检索本端和对端日志。连接的对端信息:包括对端名称(dn_6009_6010),对端IP和端口(172.31.17.4:45138),部分ERROR日志中缺失对端信息的,需通过grep query_id查找CN日志找到对端信息。errno信息(timeout expired):用于诊断具体的错误原因errno信息主要错误原因如下:timeout expired:表明连接已正常建立,但在认证握手时等待超时,一般是对端进程没有响应,需根据对端信息查看报错时间点对端进程状态。Connection timed out:建立连接超时,说明网络不通畅。如果是偶现,则说明网络丢包导致重传超时(可用gsar脚本检查,还需关注/sbin/sysctl -a|grep retries中tcp重传次数是否正确配置)。No route to host:表明IP不可达,使用ping命令检查网络连通性,检查防火墙配置。可以使用telnet/speed_test工具检查目的端口是否可以连通。Connection refused:表明IP是可达的,但监听端口不存在。确认IP/端口信息配置正确,确认对端进程存活,到对端机器通过”netstat -anop|grep 对端进程号|grep LISTEN“检查监听端口正确监听在目的IP上,检查防火墙配置。Operation now in progress:连接未完全建立好,可以参考Connection timed out处理方式。can not accept connection in standby mode:对端是备机不能接受连接,需通过query_id查找CN日志找到连接对应主机的报错进一步分析。Resource temporarily unavailable:如果是对端上报的,则看对端日志。如果是本端通信接口报错,需结合Error Message分析。Connection reset by peer:网断断开,对端有异常关闭连接或网络原因造成网络闪断。Broken pipe:网断断开,对端有异常关闭连接或网络原因造成网络闪断。
-
一、pooler连接池是什么?pooler连接池是GaussDB CN进程内保存与其他GaussDB进程数据连接的数据结构,主要作用是连接复用,节省建连、认证、对端线程启动初始化开销。CN的pooler连接池中会保存与其他CN/DN的连接,每一个连接在对端会对应一个postgres工作线程。postgres工作线程是带状态属性的,如database,所以可以认为pooler连接池中的连接也是带属性的。不同属性间的连接是不能复用的,如上图所示,按不同属性切分为pool A/B/C等连接池。每个连接池中会存有连接往不同节点的空闲连接的数组,提供接口给外部使用或放入连接。CN上的postgres工作线程在需要连接其他节点时,会创建一个本地agent,尝试从pooler连接池取跟本线程相同属性的空闲连接,pooler如果没有空闲连接,就会新建一个连接。连接交给agent后,可以视为线程私有。在线程退出时,agent才会将连接还给pooler。注意:enable_stateless_pooler_reuse为on时,连接只按database区分连接池;enable_stateless_pooler_reuse为off时,连接按database+user+option区分连接池。二、怎么查看pooler连接池一般pooler连接池中的连接会非常多,可以按不同字段group by查看某个db pool池中的连接情况,或连往某个node的连接情况,如:select database,user_name,node_name,in_use,count(*) from pg_pooler_status group by 1, 2, 3 ,4 order by 5 desc limit 50;三、pooler连接池相关问题定位1,空闲连接太多导致DN线程超过max_connectionsDN上报错误信息:FATAL :dn_6011_6012 :[FATAL] Already too many clients. active/non-active: 998/1069/3表明DN上2000个线程用满了,但有1069个空闲线程,此时可以通过在各个CN上查询pooler视图,统计连接此DN的空闲连接,确认问题。并通过手动clean connection清理空闲连接。CLEAN CONNECTION TO ALL FORCE FOR DATABASE postgres;最新版本已支持自动清理空闲连接功能。2,查询性能慢,查看CN pg_thread_wait_status视图显示大量建连状态"pooler create conn"大量pooler建连状态,说明空闲连接不够用。需要先确认当前的空闲连接状态:select in_use,count(*) from pg_pooler_status group by 1 order by 2 desc where database='XXX' and node_name='XXX';如果空闲连接和非空闲连接都很少,说明连接用完即销毁了。需要确认pooler连接池回收参数pooler_cache_connection=on,并确认CN日志没有报错。如果非空闲连接很多,空闲连接很少,说明并发太大,连接都在使用中,需要降低并发,或调大max_pool_size。
-
使用union all代替union,union在合并两个集合时会执行去重操作,而union all则直接将两个结果集合并、不执行去重。执行去重会消耗大量的时间,因此,在一些实际应用场景中,如果通过业务逻辑已确认两个集合不存在重叠,可用union all替代union以便提升性能。 join列增加非空过滤条件,若join列上的NULL值较多,则可以加上is not null过滤条件,以实现数据的提前过滤,提高join效率 not in转not exists,not in语句需要使用nestloop anti join来实现,而not exists则可以通过hash anti join来实现。在join列不存在null值的情况下,not exists和not in等价。因此在确保没有null值时,可以通过将not in转换为not exists,通过生成hash join来提升查询效率 避免对索引使用函数或表达式运算,对索引使用函数或表达式运算会停止使用索引转而执行全表扫描尽量避免在where子句中使用!=或<>操作符、null值判断、or连接、参数隐式转换对复杂SQL语句进行拆分,对于过于复杂并且不易通过以上方法调整性能的SQL可以考虑拆分的方法,把SQL中某一部分拆分成独立的SQL并把执行结果存入临时表。
-
尽量使用执行效率比较高的数据类型,一般来说整型数据运算(包括=、>、<、≧、≦、≠等常规的比较运算,以及group by)的效率比字符串、浮点数要高尽量使用短字段的数据类型,长度较短的数据类型不仅可以减小数据文件的大小,提升IO性能;同时也可以减小相关计算时的内存消耗,提升计算性能。比如对于整型数据,如果可以用smallint就尽量不用int,如果可以用int就尽量不用bigint使用一致的数据类型,表关联列尽量使用相同的数据类型。如果表关联列数据类型不同,数据库必须动态地转化为相同的数据类型进行比较,这种转换会带来一定的性能开销应尽量使用高效数据类型。选择数值类型时,在满足业务精度的情况下,选择数据类型的优先级从高到低依次为整数、浮点数、NUMREIC对于字符串数据,建议使用变长字符串数据类型,并指定最大长度。请务必确保指定的最大长度大于需要存储的最大字符数,避免超出最大长度时出现字符截断现象。除非明确知道数据类型为固定长度字符串,否则,不建议使用CHAR(n)、BPCHAR(n)、NCHAR(n)、CHARACTER(n)对于日期类型,时间精度要求大于等于1天的,可以使用varchar2存储;时间精度要求大于等于1秒的,宜使用date类型;时间精度要求小于1秒的,应使用timestamp类型 在需要数据类型转换(不同数据类型进行比较或转换)时,应使用强制类型转换,以防隐式类型转换结果与预期不符
-
分区表创建使用原则如下:1、 对于记录数小于100万的表,可以不使用分区表。2、 对于记录数超过100万、低于500万的表,宜使用分区表。3、 对于记录数超过500万且空间占用超过2GB的表,应使用分区表。4、 分区表的单个分区记录数可超过500万,空间占用不宜超过2GB。5、 暂不支持复合分区、二级分区。6、 对于如下特殊场景,可不使用分区表:A) 备份表或者老化表此类数据表存放应用系统不再使用到的数据,在联机程序和批量程序均不访问此类数据,仅用于某些特殊场景下(例如生产问题排查、公/检/法查询等)使用,通过直接查询数据库的方式访问,相关数据应使用truncate或者drop来进行清理。B) 交换分区表此类数据表是存放分区表某个分区的数据,通过交换分区技术与分区表进行数据传递。C) 采用分库分表设计的表此类数据表已通过分库、分表策略进行了数据分割,可不使用分区表。D) 批量处理中使用到的中间表、临时表,可不使用分区表。E) 外公司产品中达到分区表条件的数据表,经评估如因外公司产品原因无法分区,应按应用维度提交规范例外,并随规范例外管理流程定期与外公司确认分区的可行性。F) 对于存量应用达到分区条件的数据表,如应用规划废止,可不使用分区表。7、 对于记录数超过100万且需要进行历史数据清理的表,宜通过业务发生日期等数据清理条件进行分区,通过分区truncate或exchange技术进行数据清理。8、 分区的关键字应是where字句中的查询条件之一,分区的关键字不宜进行更新操作,避免数据因分区条件变化进行分区移动,导致性能下降。9、 从数据的维护和使用效率情况看,除非是业务的特别需求,宜使用分区索引并设计为前缀分区索引。10、 当表中的数据量很大时,应当对表进行分区,一般需要遵循以下原则:− 应使用具有明显区间性的字段进行分区,比如日期、区域等字段上建立分区。− 分区名称应当体现分区的数据特征。例如,关键字+区间特征。− 将分区上边界的分区值定义为MAXVALUE,以防止可能出现的数据溢出。
-
一、怎么创建索引?• 在经常需要搜索查询的列上创建索引,可以加快搜索的速度。• 在作为主键的列上创建索引,强制该列的唯一性和组织表中数据的排列结构。• 在经常使用连接的列上创建索引,这些列主要是一些外键,可以加快连接的速度。• 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。• 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。• 在经常使用WHERE子句的列上创建索引,加快条件的判断速度。• 为经常出现在关键字ORDER BY、GROUP BY、DISTINCT后面的字段建立索引。二、怎么建立表结构?建表的原则:(1)表数据均匀分布在各个DN上,以防止单个DN对应的存储设备空间不足造成集群有效容量下降。选择合适分布列,避免数据分布倾斜可以实现该点(2)表Scan压力均匀分散在各个DN上,以避免单DN的Scan压力过大,形成Scan的单节点瓶颈。分布列不选择基表上等值filter中的列可以实现该点(3)减少扫描数据数据量。通过分区的剪枝机制可以实现该点(4)尽量极少随机IO。通过聚簇/局部聚簇可以实现该点(5)尽量避免数据shuffle,减小网络压力。通过选择join-condition或者group by列为分布列可以最大程度的实现这点。1、 怎么选择存储类型:行存表:点查询,返回记录少,基于索引的简单查询;增删改较多的表列存表:大表,统计分析类查询,group、join比较多的表2、 怎么选择分布方式:复制表:适用于记录较少的的维度表哈希表:数据量比较大的实事表3、 怎么选择分布列:列值应比较离散,以便数据能够均匀分布到各个DN。例如,考虑选择表的主键为分布列,如在人员信息表中选择身份证号码为分布列在满足第一条原则的情况下尽量不要选取存在常量filter的列。例如,表dwcjk相关的部分查询中出现dwcjk的列zqdh存在常量的约束(例如zqdh=’000001’),那么就应当尽量不用zqdh做分布列在满足前两条原则的情况,考虑选择查询中的连接条件为分布列,以便Join任务能够下推到DN中执行,且减少DN之间的通信数据量4、 怎么使用PCK局部聚簇:受基表中的简单表达式约束。这种约束一般形如col op const,其中col为列名,op为操作符 =、>、>=、<=、<,const为常量值 尽量采用选择度比较高(过滤掉更多数据)的简单表达式中的列尽量把选择度比较低的约束col放在Partial Cluster Key中的前面 尽量把枚举类型的列放在Partial Cluster Key中的前面
-
最近遇到一个客户场景,涉及共享schema的权限问题。场景简单可以描述为:一些用户是数据的生产方,需要在schema中创建表并写入数据;另一些用户是数据的消费方,读取schema中的数据做分析。对于该schema权限管理的一种实现方法是数据生产方在每次创建新表后告知管理员用户使用grant select on all tables in schema语法来授予消费方权限。这种方法有一定的局限性。如果生产方在schema下面又创建了一些新表,为了授权消费方使用这些新表还需要告知管理员用户再次使用grant select on all tables in schema来授权。有没有简单的应对方案?答案是肯定的,可以使用Alter default privilege。Alter default privilege用于将来创建的对象的权限的授予或回收。所有在共享schema中创建对象的用户都应该出现在alter default privileges for user之后的列表中。否则,如果有用户creator3没有在列表中,其在共享schema中创建的对象或者说那些Owner是creator3的对象将不能被user1查询。因为共享schema中creator3用户创建的表没有授予user1默认权限。管理员可以通过alter default privileges for user将creator3放入列表中为user1授予访问creator3用户创建表的默认权限,也可以由creator3用户自己通过alter default privileges授权给user1. 前面语法参数说明中有如果省略FOR ROLE/USER,则缺省值为当前用户。alter default privileges只处理将来的对象,grant只处理已有的对象。进一步的,这两种语法授予权限时涉及的对象仅包括Owner是当前用户的对象。如果要为共享schema下面所有Owner的对象授予权限,需要使用管理员用户使用alter default privileges for user语法和grant语法。
-
数据仓库建设过程中,总是会涉及到不同平台、同一平台物理环境搬迁,由于数据仓库数据量庞大,往往数据搬迁不可能在一个短周期内完成,会涉及数据同步、校验、追批并跑、再校验过程。校验手段根据常见数据存储类型,主要完成对象级记录一致性校验,字段级数值、时间、字符类型的数据一致性校验,即常规提到的表级count、字段级数值的sum、时间类型差值sum、字符类型的checksum。下文以TD搬迁GaussDB(DWS)为例:记录数a) 表级count(*)数据类型a) 汇总Sum(cola)b) 平均Avg(cola)c) 例外,针对float类型这种存在精度缺失场景,或直接不校验,或比对两个平台差异小于5%范围即可接受;d) 注意事项,不同平台可能存在sum放大小数点位数问题,可通过指定小数点位置,让两个平台数值完全一致;时间类型a) 汇总Sum(时间转换数字)b) Date类型实现样式校验方式根据数据仓库特性,可以分为常规批量校验和自定义校验;通常,可以将校验嵌入批量过程中,即对应作业的数据表发生变化后,直接触发相关数据表校验,这样实现数据准实时校验,保证两个平台并跑期间数据一致性;另外,在确保两个平台数据稳定前提下,可以固定时间段或用户直接发起实时校验,用于核对平台一致性;校验策略可进行数据表分级分类,将有限校验计算资源投入到数据一致性校验中,可参照以下分类:自动化服务自动化校验框架,建议常驻rest服务,用于接收客户端触发的校验请求,分发各数据平台执行校验采集工作,利用rest服务实现跨服务器交互问题;采用一个portal展现界面,用于用户录入自定义校验规则以及查看数据校验情况。
-
在GaussDB(DWS)中,我们增加了参数query_dop,来控制语句的并行度,取值如下:1)query_dop=1,串行执行,默认值2)query_dop=[2..N],指定并行执行并行度3)query_dop=0,自适应调优,根据系统资源和语句复杂度情况自适应选择并行度由于开启并行会占用较多的内存,所以目前GaussDB(DWS)的默认并行度为1。在内存较大的环境下,可以通过手动设置query_dop达到并行加速的目的。通常情况下,我们可以考虑首先设置query_dop=0,查看语句的执行计划、performance信息和性能。在performance信息的下方Query Summary一栏,可以看到自适应dop选择的信息,例如:TPC-DS Q48 dop选择信息如下图所示,可以看出初步选定的initial dop为24,最终确定的final dop为26。dop的选择会综合考虑各种因素,其信息也在图中显示出来。由于自适应选择并行度是根据语句复杂度和系统资源利用情况来进行选择,而系统资源利用情况是获取前一段时间的资源利用情况,有可能出现不准确的情况,此时就需要人为来设置并行度了。人为设置并行度,并不是设置越大越好,dop设置过大,会导致系统中的线程数量急剧增多,导致CPU冲突进行线程切换的额外开销。要想人为设置并行度,同样需要使用单机CPU核数和语句复杂程度进行考量。我们定义单机CPU核数/单机DN数为每个DN可用的CPU核数x,然后根据串行计划中DN Stream算子的个数初步判定语句的复杂度y(例如下图TPC-H Q1计划中只有一个Stream节点,则y为1),单并发时,使用x/y的值设置query_dop。并发场景,再除以并发数p设置query_dop。由于此公式为粗略估计值,因此在设置时可以考虑扩大搜索范围,来寻找合适的并行度。在并发场景下,GaussDB(DWS)还支持max_active_statements来控制执行语句的个数,当语句的个数超过CPU核数时,可以考虑使用该参数限制并发数,然后再设置合理的query_dop进行调优。还是以刚才的示例为例,单机有96核,2个DN,则每个DN可用48核,则同时执行6个TPC-H Q1查询时,并行度可以设置为8。
-
随着硬件系统的越来越好,数据库运行的CPU、磁盘、内存资源都日渐增大,SQL语句的串行执行由于不能充分利用资源,已经不能满足日益发展的需要。为此GaussDB(DWS)开发了并行计算技术,在语句执行时可以充分利用硬件资源进行并行加速,提高执行的吞吐率。并行计算的原理很简单,将原本一个线程的工作平均分配到多个线程来完成,原本需要操作四份数据,通过并行度为4的并行计算后,每个子线程仅需要处理一份数据,理论上性能提升可以达到4倍。通常情况下,理论上的性能提升是达不到的,因为并行计算也有其性能损耗,包括:启动线程的代价,以及线程之间进行数据传输的代价。因此,只能性能损耗较低,大大低于并行带来的收益时,并行计算的收益才比较明显。所以,并行只有在数据量较大的场景下才能获得较高的性能收益,非常适合于分析型的AP场景。通过上述分析,我们可以看出,并行计算的难点不在于如何并行,而在于如何正确选择并行度。当数据量较小时,也许串行的性能是最好的,当数据量增大时,可以考虑进行并行。对于一个复杂的执行计划来说,可能包含多个算子,每个算子处理的数据量都不一样,如何综合考虑并行度,以及处理好各算子之间的数据收发关系,将成为并行计算技术的关键难点。并行计算的Stream线程仍然沿用DN间的Stream线程进行启动和停止,但DN内部的数据传输改为内存拷贝进行,更节省网络资源,但带来一定程度的内存开销。同时,并行度的增大也使得跨DN间数据传输的数据缓冲区增大,内存开销变大。因此,大内存也是提高并行度的一个必备因素。那么线程之间是如何进行并行度的衔接呢?通过计划,我们可以看出,并行场景下,Stream线程均显示为:Streaming(type: T dop:N/M),这是在串行场景基础上的扩展,同时也可以以线程为级别看到每个线程执行时间,处理的行数和使用的内存。在串行场景下,我们支持三种类型的Stream算子,分别为redistribute, broadcast和gather,并行场景是对串行场景中DN上的redistribute和broadcast类型Stream算子进行扩充,包括以下几类:1)Streaming(type: SPLIT REDISTRIBUTE):同串行场景下的Redistribute,但以线程为单位进行数据传输,每条元组发送给一个目的线程。2)Streaming(type: SPLIT BROADCAST):同串行场景下的Broadcast,但以线程为单位进行数据传输,每个线程都将收到全量数据。3)Streaming(type: LOCAL REDISTRIBUTE):作用是DN内部根据当前分布键进行数据Redistribute。通常作用于基表扫描后,因为基表扫描是按页面进行线程划分,此时线程间并不是按DN的分布键分布的,需要增加该DN内重分布操作。4)Streaming(type: LOCAL BROADCAST):作用是DN内部进行数据Broadcast,每个线程把数据发送给这个DN的所有线程,每个线程获得该DN的全量数据。5)Streaming(type: LOCAL GATHER):作用是DN内部把数据从多线程汇总到一个线程。注意:“dop:N/M”表示发送端的dop为M,接收端的dop为N,从而完成从M个线程的并行度转变为N个线程并行度的任务。
-
1) 待备份表定义的导出和备份如果是库级的备份,将逐个schema地进行元数据导出;处理每一个schema时,又将逐个导出所有的表定义,因此,我们下图展示了Roach逻辑备份导出一个表DDL的过程。Roach Master节点接到备份指令后,向一个有CN的节点Roach Agent下发指令,该Agent进程再调用gs_dump,连CN进行表定义DDL的导出。2) 创建外表Roach逻辑备份过程,本质是建立外表进行数据导出的过程,类似上一步的表定义导出,Roach Agent接受Master指令后,基于导出的表定义,连CN创建写外表,创建的外表使用gsmpp_server, server的option中,location为roach://{Roach Agent监听端口},其中,Roach Agent监听端口为参数可配置,将接受该节点上所有DN实例的连接,Roach逻辑备份外表定义类似如下形式,该待备份表仅有一个int类型字段id,图中举例的Roach Agent监听端口为8080,可配置,导出格式为csv。3) Roach工具与DN的建连及数据导出备份当前GaussDB(DWS)的集中主要数据导入导出外表包括GDS、HDFS、OBS、Roach等四种,Roach外表同其他几种外表类似,都通过FDW(Foreign Data Wrapper)完成,但注册了一系列属于Roach的FDW API接口实现,此外,Roach还实现了Open/Read/Write/Close/ErrorReport等五个主要的底层读写API,实现DN与Roach Agent之间的数据交互。Phase1: 备份数据的命令被Master下发给所有Agent,连一个CN,连数据库创建外表导出server、创建导出外表,每个节点的Roach Agent同样会创建一个TblServer线程,监听Agent Port端口,等待DN连接;Phase2: 连一个CN执行insert into roachft select * from A;sql查询会被下发到所有DN,通过注册的Roach FDW API,DN调用回调函数,封装一个PGXCNode的消息,以自明instance身份,去尝试连接server url中的本节点Agent Port;Phase3: Roach Agent的TblServer每接收一个DN的连接,会分配一个数据通信的socket槽位,并fork一个子进程为该DN实例的备份服务;Agent会等待该节点上所有的DN都建立连接,创建lengthof(节点所有DN)个子进程,并行进行数据备份。Phase4: 每个备份子进程通过建立的连接,不断读取表数据,待该表所有切分的数据块读取完成,发送一个FINISH_BACKUP消息给Roach Agent,则停止数据传输,从DN读取的数据首先存入Agent子进程的buffer中。Phase5: 每个Agent进程内会创建一个BackupSender线程,负责消费存入buffer的表数据,与备份介质建立连接,流式进行数据的发送;Phase4、5在实际运行中是个异步并行的动作,并非等所有表数据都写入buffer后,才向备份介质发送。
-
在大数据时代,数据的完整和可靠性成为一个数仓最核心的能力之一。GaussDB(DWS)以其出众的分布式计算和存储能力广受用户青睐的同时,也特别着眼于数据备份容灾领域的创新和打磨。数据的可靠性可以说是数仓的“命门”。对于企业、政府等用户,如果因为硬件故障导致的文件损坏,或是业务操作的误删,导致了数据损坏或丢失,那么损失将是不可估量的。GaussDB(DWS)提供的Roach工具,将以其稳定、快速、可靠的备份能力,通过备份恢复数据库或业务表,为客户准备一个可靠的“后悔药”,从而有效地挽回客户损失。GaussDB(DWS)的Roach工具,同时提供物理备份和逻辑备份两种主要形态的备份。物理备份直接通过拷贝文件块,存储于备份介质之上,恢复时使用备份的文件块,重建集群中实例DN与CN的数据目录进行恢复。本文中我们主要着眼于逻辑备份,在当前的GaussDB(DWS)中,相比于物理备份,逻辑备份拥有更好的灵活性,其充分利用了GaussDB(DWS)强大的数据导入导出能力,不同于物理备份的文件整体拷贝,逻辑备份针对数据库的逻辑对象进行抽取和备份,粒度可以做到表级、schema级、database级,根据客户需要进行定制选择;在一个拥有成千上万表的客户数仓中,如果仅想要备份一张表,那么当前逻辑备份是更好的选择。GaussDB(DWS)提供的Roach是一个分布式的备份恢复工具,以一个Node1、2、3组成的集群为例,备份的总入口是python进程GaussRoach.py,它将在当前节点拉起一个roach master进程,在集群其他所有节点各拉起一个roach agent进程,是典型的master-slave框架,master进程与所有的agent进程分别建立TCP长连接,并封装报文与各个节点通信,下发备份等任务,在每个节点上,将分布式地为节点上的CN、DN等数据库对象进行备份。
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签