【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 AnimationGCMeanfrom 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 readableSELECT 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