我有一个场景如下:
我们有多个基表(只有两个表的粘贴代码仍然有很多)。每种规模约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数据并在任何地方使用该表
使用物化视图
请提供您的建议。
提前谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!