在实现性能测试报告聚合的时候,一开始使用的方案是通过数据库查询load出所有数据,然后不同维度数据不同消费者消费聚合对应的数据,这样实现当数据量超过1000w+时下载速度无法解决
因为使用的数据库是TimescaleDB,可以使用数据库直接聚合数据的方式
Aggregate Functions
PostgreSQL提供了一系列的 聚合方法
其中我们可以找到有序集合聚合函数
PERCENTILE_CONT
ERCENTILE_CONT 在对值进行排序后计算值之间的线性内插
PERCENTILE_CONT
是一种假定连续分布模型的逆分布函数。该函数具有一个百分比值和一个排序规范,并返回一个在有关排序规范的给定百分比值范围内的内插值
语法
PERCENTILE_CONT ( percentile )
WITHIN GROUP (ORDER BY expr)
OVER ( [ PARTITION BY expr_list ] )
实际栗子
表名:report_sample
描述:获取执行性能报告数据
主要字段:task_id, seconds, elapsed
字段情况:该表10个字段
数据量:1000w+
聚合数据量:30w+
使用聚合的方式
SELECT labels as transaction,
min(elapsed) as elapsed_min,
avg(elapsed) as elapsed_avg,
percentile_cont(0.5) WITHIN GROUP (ORDER BY elapsed) as elapsed_50pc,
percentile_cont(0.9) WITHIN GROUP (ORDER BY elapsed) as elapsed_90pc,
percentile_cont(0.95) WITHIN GROUP (ORDER BY elapsed) as elapsed_95pc,
percentile_cont(0.99) WITHIN GROUP (ORDER BY elapsed) as elapsed_99pc,
FROM report_sample
WHERE task_id = '45eff63a74944f6eb9bef93d8cf04f13'
group by labels;
执行3次分别所需时间 495ms、408ms、406ms
直接拉取该30w数据
select
*
from
report_sample
where
task_id = '45eff63a74944f6eb9bef93d8cf04f13';
执行3次分别所需时间 18140ms、17657ms、17876ms
很明显,直接使用数据库聚合的效率和性能远高于从数据库拉取后消费数据