关于go:近期Psql相关业务的收获agg函数对于null值的处理-arrayagg-Unmarshal的性能消耗和工作原理

【case 1】
我的项目背景:
须要返回一些GC的统计数据。相干数据存在frame这张表内,表中的数据一行就是一帧的数据,能够了解为记录了这一帧内的性能信息。与需要相干的col是GcChartSample,是一个json类型的数据,外面存的是该帧触发的各个品种的GC的大小,没有触发的GC的字段将不会列在这个GC中。例如:{“Internal”:252,”Other”:192,”Scripts”:7832},就是InternalGC是252字节,OtherGC是192字节,ScriptsGC是7832字节。
求:各类GC的无效帧均值(即:非0帧的均值)和最大值

我的第一版解法:
将区间内的所有帧的GcChartSample字段取出放入go中,在go中进行解决。即:先开一个gcLineMap记录所有呈现过的GC品种,而后再依据gcLineMap建设gcItemArray,分类push 非0的GC值,最初依据各个数组算出统计数据。

弱化局部需要后,mentor举荐的解法:
用户在查看性能报告的时候,通常只会关注局部GC的值,例如:ScriptsGC,RenderingGC等。因而,并不一定要求出所有GC的统计。并且sql善于做统计的操作。将统计的工作放在sql里做,可能缩小IO。
因而,sql批改如下:

select sum(cast(GcChartSample ->> 'Scripts' as Integer)) as ScriptsGCMax, round(count(cast(GcChartSample ->> 'Scripts' as Integer)), 2) as ScriptsGCMean,
       max(cast(GcChartSample ->> 'Rendering' as Integer)) as RenderingGCMax, round(avg(cast(GcChartSample ->> 'Rendering' as Integer)), 2) as RenderingGCMean,
       max(cast(GcChartSample ->> 'GUI' as Integer)) as GUIGCMax, round(avg(cast(GcChartSample ->> 'GUI' as Integer)), 2) as GUIGCMean,
       max(cast(GcChartSample ->> 'Animation' as Integer)) as AnimationGCMax, round(avg(cast(GcChartSample ->> 'Animation' as Integer)), 2) as AnimationGCMean
from upa.frame where partitionkey = 5;

起初放心,应用sql里的avg操作只能返回均值,无奈返回无效帧均值。然而,翻阅sql文档后发现,sum会主动疏忽值为null的字段。

psql agg操作总结如下:
AVG

SELECT AVG(amount)::numeric(10,2) FROM payment; //To make the output more readable
SELECT AVG(DISTINCT amount)::numeric(10,2) FROM payment; //The following query returns the average payment made by customers. Because we use DISTINCT, PostgreSQL only takes unique amounts and calculates the average.

COUNT

将列名作为参数,失去NULL之外的数据行数
将星号作为参数,失去所有数据的行数(蕴含NULL)。

SUM

对于列外面数据有NULL的,也是会当时去掉NULL再计算。

【case 2】
翻阅组内我的项目的时候发现,psql中含有array_agg操作的,通常都不会在go端做解决,而是以string的形式接管,传递给前端解析成json进行操作。

学习笔记:
PostgreSQL array_agg() 函数是一个聚合函数,它返回一个蕴含了一个分组中的所有的值的组成的数组。

【case 3】
我的项目背景:
在做一个需要的时候,我将一个某个sql的返回值用string接到后,进行了Unmarshal操作,mentor提醒说最好寻找一下优化的办法,因为Unmarshal操作要一个一个的对,比拟伤性能。

学习笔记:

  • Unmarshal将json字符串解码到相应的数据结构。
  • json字符串解析时,须要一个“接管体”承受解析后的数据,且Unmarshal时接管体必须传递指针。
  • 解析时,接管体可自行定义。json串中的key主动在接管体中寻找匹配的项进行赋值。
  • 匹配规定:先查找与key一样的json标签,找到则赋值给该标签对应的变量;没有json标签的,就从上往下顺次查找变量名与key一样的变量,或者变量名疏忽大小写后与key一样的变量,第一个匹配的就赋值,前面就算有匹配的也疏忽(变量可导出,首字母大写)。
  • 当接管体中存在json串中匹配不了的项时,解析会主动疏忽该项,该项仍保留原值。
  • json解析后,json串中value,只有是”简略数据”,都会依照默认的类型赋值。
  • 简略数据:是指不能再进行二次json解析的数据,例如name
  • 复合数据:是可进行二次甚至屡次json解析的,因为它的value也是个可被解析的独立json

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据