• [知识分享] 解析数仓OLAP函数:ROLLUP、CUBE、GROUPING SETS
    本文分享自华为云社区《[GaussDB(DWS) OLAP函数浅析](https://bbs.huaweicloud.com/blogs/349413?utm_source=csdn&utm_medium=bbs-ex&utm_campaign=ei&utm_content=content)》,作者: DWS_Jack_2。 在一些报表场景中,经常会对数据做分组统计(group by),例如对一级部门下辖的二级部门员工数进行统计 create table emp( id int, --工号 name text, --员工名 dep_1 text, --一级部门 dep_2 text --二级部门 ); gaussdb=# select count(*), dep_2 from emp group by dep_2; count | dep_2 -------+------- 200 | SRE 100 | EI (2 rows) 常见的统计报表业务中,通常需要进一步计算一级部门的“合计”人数,也就是二级部门各分组的累加,就可以借助于rollup,如下所示,比前面的分组计算结果多了一行合计的数据 gaussdb=# select count(*), dep_2 from emp group by rollup(dep_2); count | dep_2 -------+------- 200 | SRE 100 | EI 300 | (3 rows) 如上是一种group by扩展的高级分组函数使用场景,这一类分组函数统称为OLAP函数,在GaussDB(DWS)中支持 ROLLUP,CUBE,GROUPING SETS,下面对这几种OLAP函数的原理和应用场景做一下分析。 首先我们来创建一张表,customer,用户信息表,其中包含了用户id,用户名,年龄,国家,用户级别,性别,余额等信息 create table customer ( c_id char(16) not null, c_name char(20) , c_age integer , c_country varchar(20) , c_class char(10), c_sex text, c_balance numeric ); insert into customer values(1, 'tom', '20', 'China', '1', 'male', 300); insert into customer values(2, 'jack', '30', 'USA', '1', 'male', 100); insert into customer values(3, 'rose', '40', 'UK', '1', 'female', 200); insert into customer values(4, 'Frank', '60', 'GER', '1', 'male', 100); insert into customer values(5, 'Leon', '20', 'China', '2', 'male', 200); insert into customer values(6, 'Lucy', '20', 'China', '1', 'female', 500); # ROLLUP 本文开头的示例已经解释了,ROLLUP是在分组计算基础上增加了合计,从字面意思理解,就是从最小聚合级开始,聚合单位逐渐扩大,例如如下语句 select c_country, c_class, sum(c_balance) from customer group by rollup(c_country, c_class) order by 1,2,3; c_country | c_class | sum -----------+------------+------ China | 1 | 800 China | 2 | 200 China | | 1000 GER | 1 | 100 GER | | 100 UK | 1 | 200 UK | | 200 USA | 1 | 100 USA | | 100 | | 1400 (10 rows) 该语句功能等价于如下 select c_country, c_class, sum(c_balance) from customer group by c_country, c_class union all select c_country, null, sum(c_balance) from customer group by c_country union all select null, null, sum(c_balance) from customer order by 1,2,3; c_country | c_class | sum -----------+------------+------ China | 1 | 800 China | 2 | 200 China | | 1000 GER | 1 | 100 GER | | 100 UK | 1 | 200 UK | | 200 USA | 1 | 100 USA | | 100 | | 1400 (10 rows) 尝试理解一下 GROUP BY ROLLUP(A,B): 首先对(A,B)进行GROUP BY,然后对(A)进行GROUP BY,最后对全表进行GROUP BY操作 # CUBE CUBE从字面意思理解,就是各个维度的意思,也就是说全部组合,即聚合键中所有字段的组合的分组统计结果,例如如下语句 select c_country, c_class, sum(c_balance) from customer group by cube(c_country, c_class) order by 1,2,3; c_country | c_class | sum -----------+------------+------ China | 1 | 800 China | 2 | 200 China | | 1000 GER | 1 | 100 GER | | 100 UK | 1 | 200 UK | | 200 USA | 1 | 100 USA | | 100 | 1 | 1200 | 2 | 200 | | 1400 (12 rows) 该语句功能等价于如下 select c_country, c_class, sum(c_balance) from customer group by c_country, c_class union all select c_country, null, sum(c_balance) from customer group by c_country union all select null, null, sum(c_balance) from customer union all select NULL, c_class, sum(c_balance) from customer group by c_class order by 1,2,3; c_country | c_class | sum -----------+------------+------ China | 1 | 800 China | 2 | 200 China | | 1000 GER | 1 | 100 GER | | 100 UK | 1 | 200 UK | | 200 USA | 1 | 100 USA | | 100 | 1 | 1200 | 2 | 200 | | 1400 (12 rows) 理解一下 GROUP BY CUBE(A,B): 首先对(A,B)进行GROUP BY,然后依次对(A)、(B)进行GROUP BY,最后对全表进行GROUP BY操作。 GROUPING SETS GROUPING SETS区别于ROLLUP和CUBE,并没有总体的合计功能,相当于从ROLLUP和CUBE的结果中提取出部分记录,例如如下语句 select c_country, c_class, sum(c_balance) from customer group by grouping sets(c_country, c_class) order by 1,2,3; c_country | c_class | sum -----------+------------+------ China | | 1000 GER | | 100 UK | | 200 USA | | 100 | 1 | 1200 | 2 | 200 (6 rows) 该语句功能等价于如下 select c_country, null, sum(c_balance) from customer group by c_country union all select null, c_class, sum(c_balance) from customer group by c_class order by 1,2,3; c_country | ?column? | sum -----------+------------+------ China | | 1000 GER | | 100 UK | | 200 USA | | 100 | 1 | 1200 | 2 | 200 (6 rows) 理解一下 GROUP BY GROUPING SETS(A,B): 分别对(B)、(A)进行GROUP BY计算 目前在GaussDB(DWS)中,OLAP函数的实现,会有排序(sort)操作,相比等价的union all操作,效率并不会有提升,后续会通过mixagg的支持来提升OLAP函数的执行效率,有兴趣的同学,可以explain打印一下计划,来看一下OLAP函数的执行流程。
  • [集群性能] GaussDB(DWS) HCS形态,Stream和Gather算子慢怎么办
    【问题现象】执行计划中Stream和Gather算子慢,等待视图中有wait quota/stream get conn等等待事件【版本信息】:HCS 8.0.1【问题影响】客户查询出现性能劣化,语句执行时间从3s劣化到10min+【排查过程】1. 查看网络重传情况,网络重传率高    cd $GAUSSHOME/bin/dfx_tool    sh gsar.sh 网卡名    输出结果中,最后一列表示网络重传率,一般不超过0.02%2. 查看messages日志,日志中有大量Bringing up interface/NetworkManager state等日志,如果有此类内容,说明网络服务一直在被重启,需要修改netCardMonitor.sh的脚本【问题原因】    netCardMonitor.sh脚本因为逻辑判断错误每分钟都重启 service network restart,影响网络建联,导致查询stream和gather算子慢。    netCardMonitro.sh脚本路径:/rds/mgntAgent/v8.1.1.2/os/linux/    该脚本日志路径:/var/log/netcardMonitor.log【解决方法】    在沙箱外操作,对所有节点修改:    cd /rds/mgntAgent/v8.1.1.2/os/linux/    vi netCardMonitor.sh    注释66-77行对应的内容;    同时,需要清理残留的dhclient进程:ps -ef| grep dhclient| grep -v grep |awk '{print $2}'|xargs kill -9【参考资料】    纯软场景下stream和gather慢的案例:https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=136091
  • [Sql迁移] 【GaussDB A产品】【SQL功能】GaussDB A中是否有类似的功能?Oracle使用&变量名,执行时手动输入变量
    Oracle操作如下:GaussDB A 8.1.0 执行报错,tables不存在:
  • [其他] 【DWS部署安装】对接周边系统:安装Service OM插件 子任务工步报错-HCS-Deploy859500
    问题描述: 对接周边系统:安装Service OM插件 子任务工步报错错误信息:HCS-Deploy859500,执行任务失败,错误信息:Failed to get token from om,url:goku/rest/v1.5/tokens问题版本:HCS 8.1.0问题原因:操作问题,LLD中serviceOM密码填写错误恢复方案:配置表serviceOM保留默认密码,重新导入LLD,并重试
  • [知识分享] 【大数据系列】简述数仓的时间域函数
    本文分享自华为云社区《[​​​​​​​GaussDB(DWS) 时间域函数​​​​​​​](https://bbs.huaweicloud.com/blogs/317197?utm_source=csdn&utm_medium=bbs-ex&utm_campaign=ei&utm_content=content)》,作者: 积少成多。 # 1. 什么是时间域函数,有哪些? 时间域函数是指数据库内获时间戳每部分值的函数。现有的时间域函数包括:  1) quarter函数:获取季度  2) hour函数:获取小时数  3) minute函数:获取分钟数  4) second函数:获取秒数  5) microsecond函数:获取微秒数。 # 2. 时间域函数参数的解析 时间域函数的入参类型有四种,包括:   1) date类型   2) timestamp/timestamptz类型   3) time/timetz类型   4) text类型。text类型的输入会根据输入格式转换为对应的date、timestamp/timestamptz或time类型。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/29/1651195422835141591.png)                  时间域函数入参支持类型表 参数解析支持时区设置,当输入参数含时区时,结果会转换为当前时区。以下用例中,数据库的默认时区为+08:00时区。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/29/1651195443063112467.png) # 3. 结果展示 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/29/1651195458005331118.png) # 4.总结   时间域函数是为获取时间戳各部分值而增加的函数。支持对text类型入参的的解析,使text类型入参进行隐式转换,解析成为对应时间戳类型获取目标值,更贴近实际场景。 **想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦~**
  • [Sql迁移] 【DWS】【外表导入】创建OBS外表后,将数据导入外表报错Failed to open file region_map
    【功能模块】在DWS创建OBS外表后,将数据导入外表报错Failed to open file region_map【操作步骤&问题现象】1、再dws上创建存储为OBS的外表2、将DWS数据insert到外表【截图信息】建表语句:【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] GaussDB DWS的安装部署时出现g_parted_conf无效的问题
    【功能模块】产品文档中的“配置和检查安装环境”模块【操作步骤&问题现象】1、在配置安装环境时,编辑preinstall配置文件结束后使用./setuptool.sh preinstall -n执行配置文件时出现报错该怎样解决?【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [环境搭建] GaussDB DWS对磁盘数量的要求
    【功能模块】GaussDB DWS在环境搭建时需要配置规划工具,官网上给出了规划工具,产品文档中要求至少一个系统盘一个数据盘,但是我只买了一块磁盘,而使用规划工具时至少需要三块磁盘才能布置成功。【操作步骤&问题现象】1、只有一块磁盘能搭建完成吗?2、如果不行,那我应该怎样把一块磁盘分区,分为三块呢?【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] spark 读hive 写gaussdb 问题求助
    【功能模块】用spark 读hive 写gaussdb代码如下:取hive一条数据测试【操作步骤&问题现象】提交到yarn上 client模式  但是出现如下问题:、请问如何解决?是配置问题 ,还是其它问题?【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [生态工具] 【GaussDB DWS】请问有没有适用于Euler-aarch64系统的GaussDB性能测试工具?
    请问有没有适用于Euler-aarch64系统的GaussDB性能测试工具?官方的验收测试和对应的工具使用时,在aarch64系统中会出现【cannot execute binary file: Exec format error】的报错。请大家推荐一下吧。
  • [问题求助] spark 读hive 数据处理写入gaussdb 出现问题
    【功能模块】【操作步骤&问题现象】我用spark读Hive数据 然后写入gaussdb时  出现下述问题为了方便测试,取了hive的一条数据,然后写gaussdb  ;submit 提交到yarn集群跑的,client模式。请问是写错了,还是哪里配置的不对?谢谢【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [开发应用] GaussDB A 800版本,使用连接池疑问
    【操作步骤&问题现象】GaussDB A 800版本,使用连接池疑问必须使用“SET SESSION AUTHORIZATION DEFAULT;RESET ALL;”将连接的状态清空。如果使用了临时表,那么在将连接归还连接池之前,必须将临时表删除。这两块如何通过代码实现?在使用连接池执行任务时如何能取消集群内正在执行的sql?
  • [问题求助] 【DMAX】【数据中心】配置连接DWS数据库连接失败
    【功能模块】DMAX-->数据中心,新建数据源连接DWS数据库【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【GaussDB】【AI数据挖掘】对个人开发者免费么?
    【功能模块】想利用GaussDB 存储5-40万条 数据,为天线的结构尺寸和天线全频段的S参数,并通过ModelArts做正向、逆向天线设计。类似ANTENNA MAGUS主要是研究探索用,想问HW是有免费的存储方案么?穷人一个。GaussDB 连接应该顺畅吧?之前试过OBS没问题。【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [其他] GaussDB(DWS) 运维高频SQL语句汇总
    1. 查看长时间运行的SQL语句SELECT sysdate - query_start AS runtime, usename, coorname, pid, query_id, waiting, enqueue, substr(query, 1, 70) AS query FROM pgxc_stat_activity WHERE STATE != 'idle' AND usename != 'omm' AND usename != 'Ruby' ORDER BY runtime DESC LIMIT 50;2. 统计CN节点上的会话数SELECT enqueue, state,count(*) FROM pgxc_stat_activity GROUP BY 1,2;SELECT coorname,enqueue, state,count(*) FROM pgxc_stat_activity GROUP BY 1,2,3;SELECT usename,coorname,enqueue, state,count(*) FROM pgxc_stat_activity GROUP BY 1,2,3,4;3. 等待视图统计查询select wait_status, wait_event,count(*) from pgxc_thread_wait_status group by 1,2 order by 3 desc;4. 通过PID查杀语句EXECUTE DIRECT ON (CN_5003) 'SELECT PG_TERMINATE_BACKEND(281378607331584)';5. 查看占用内存大的SQLselect sessid, pg_size_pretty(sum_total) as total,pg_size_pretty(sum_free) free,pg_size_pretty(sum_used) used,query_id,query_start,state,waiting,enqueue,substr(query, 1,60) as query from (select sessid,sum(totalsize) as sum_total,sum(freesize) as sum_free,sum(usedsize) as sum_used from pv_session_memory_detail group by sessid ) a,pg_stat_activity b where split_part ( a.sessid,'.' , 2 ) = b.pid order by sum_total desc limit 10;6.  通过query_id查看SQL内存上下文占用情况select sessid, contextname, level,parent, pg_size_pretty(totalsize) as total ,pg_size_pretty(freesize) as freesize, pg_size_pretty(usedsize) as usedsize, datname,query_id, substr(query, 1,60) as query from pv_session_memory_detail a , pg_stat_activity b where split_part(a.sessid,'.',2) = b.pid  and query_id = '74309393851630636' order by totalsize desc limit 10; 
总条数:2746 到第 页
上滑加载中