【postgresql】數據聚合之PERCENTILE_CONT

在實現性能測試報告聚合的時候,一開始使用的方案是通過數據庫查詢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

很明顯,直接使用數據庫聚合的效率和性能遠高於從數據庫拉取後消費數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章