鑒于下表
桶
metric_id|start_date |bucket
------------------------------------
a |2019-12-05 00:00:00|1
a |2019-12-06 00:00:00|2
b |2021-10-31 00:00:00|1
b |2021-11-01 00:00:00|2
積分
point_id|metric_id|timestamp
----------------------------
1 |a |2019-12-05 00:00:00
2 |a |2019-12-06 00:00:00
3 |b |2021-10-31 00:00:00
4 |b |2021-11-01 00:00:00
以及以下查詢
select
p.metric_id,
bucket
from points p
left join width_bucket(p.timestamp, (select array(select start_date
from buckets b
where b.metric_id = p.metric_id -- correlated sub-query
))) as bucket on true
輸出
metric_id|bucket
-----------------
a |1
a |2
b |1
b |2
如何洗掉相關子查詢以提高性能?
目前 ~280,000 點 * ~650 桶 = ~180,000,000 回圈 = 非常慢!
基本上,我想洗掉相關的子查詢,并對存盤桶中的每個唯一 metric_id 僅應用一次 width_bucket 函式,以便提高性能,并且仍然為該函式提供正確的時間序列資料。
如何在 Postgres 13 中做到這一點?
uj5u.com熱心網友回復:
你可以重寫你的查詢:
select
p.metric_id,
width_bucket(p.timestamp,array_agg(b.start_date)) bucket
from points p
left join buckets b on b.metric_id = p.metric_id
group by p.metric_id, p.timestamp
在buckets.start_date & points(metric_id,timestamp)上添加索引也會有很大幫助。
uj5u.com熱心網友回復:
您可以先使用 cte 聚合存盤桶
with buckets_arr as (
select metric_id, array_agg(start_date order by start_date) arrb
from buckets
group by metric_id
)
select
p.metric_id,
width_bucket(p.timestamp, ba.arrb) bucket
from points p
join buckets_arr ba on p.metric_id = ba.metric_id
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/346936.html
標籤:sql PostgreSQL 查询优化 postgresql-13
上一篇:在PostgreSQL上執行查詢時,必須在表名周圍使用""嗎?
下一篇:如何在pgAdmin4中保存更改
