基于postgresql的查询优化

y3bcpkx1  于 2021-07-24  发布在  Java
关注(0)|答案(0)|浏览(215)

我有一个场景如下:
我们有多个基表(只有两个表的粘贴代码仍然有很多)。每种规模约30万(300000)个记录
我们有一个中间事务表。大小超过~500万条记录
中间事务表对每个基表都有外键引用
我们将每个基表与中间事务表连接起来,并更新中间事务表中相应的一列。
代码:



我们有疑问:

UPDATE INTERMEDIATE I
SET AVALUE = A.AVALUE
FROM A
WHERE A.AID = I.AID
AND A.StartDT <= CAST(I.DT AS DATE)
AND A.EndDT > CAST(I.DT AS DATE)
AND I.GroupID = $1;

UPDATE INTERMEDIATE I
SET BVALUE = B.BVALUE
FROM B
WHERE B.AID = I.AID
AND B.StartDT <= CAST(I.DT AS DATE)
AND B.EndDT > CAST(I.DT AS DATE)
AND I.GroupID = $1;

对于每个基表仍然有许多,它们一个接一个地连续运行,使阈值时间交叉。因此,我考虑更改查询,使它们并行/部分并行运行,以便可以根据阈值时间进行调整。
所以尝试使用以下格式:

WITH CTE AS
(
    SELECT AID,Bid,Cid,CAST(I.DT AS DATE) AS DT
    FROM INTERMEDIATE
    WHERE GroupID = $1
)
,CTE1 AS
(
    SELECT CTE.AID AS AID,A.AVALUE AS AVALUE
    FROM CTE
    INNER JOIN A ON A.AID = CTE.AID
    AND A.StartDT <= CTE.DT
    AND A.EndDT > CTE.DT
)
UPDATE INTERMEDIATE
SET AVALUE = CTE1.AVALUE
FROM CTE1
WHERE CTE1.AID = INTERMEDIATE.AID;

在这里,cte中的代码对于每个查询都是相同的,只是接下来的两个步骤是不同的。
所以我想用适当的索引来持久化第一个cte查询,这样我就可以在各自的查询中使用它,而不必为获取数据而点击中间表,而只会点击中间表来更新数据。
我想到了以下选择:
使用stage表只加载cte数据并在任何地方使用该表
使用物化视图
请提供您的建议。
提前谢谢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题