在實現性能測試報告聚合的時候,一開始使用的方案是通過數據庫查詢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
很明顯,直接使用數據庫聚合的效率和性能遠高於從數據庫拉取後消費數據