VISIT_HIST
我在 Oracle 数据仓库中有一个表。该表包含每个月的客户访问次数,并且相当大(约 1.3 亿行)。
CREATE TABLE (
VALUE_MONTH DATE,
USER_ID NUMBER,
N_VISITS NUMBER
)
;
数据本身看起来像:
VALUE_MONTH | 用户身份 | N_VISITS次 |
---|---|---|
2022 年 12 月 31 日 | 43254 | 25 |
每天晚上,作业都会执行一个存储过程,该过程会更新该表。最近 3 个月的数据从表中删除。之后,该过程插入有关每个USER_ID
用户在过去 3 个月内的访问次数的新信息(3 个月内所有用户总共插入约 10-12 百万行)。存储过程如下所示:
CREATE OR REPLACE PROCEDURE EXAMPLE_PROC IS
BEGIN
-- 1. delete old data for the last 3 months
DELETE FROM VISIT_HIST
WHERE VALUE_MONTH >= ADD_MONTHS(TRUNC(SYSDATE, 'dd.mm.yyyy'), -3)
;
COMMIT;
-- 2. insert new data
INSERT INTO VISIT_HIST
SELECT /*+ parallel(8)*/
LAST_DAY(VALUE_DAY) VALUE_MONTH,
USER_ID,
COUNT(DISTINCT VISIT_ID) N_VISITS
FROM ...
WHERE VALUE_DAY >= ADD_MONTHS(TRUNC(SYSDATE, 'dd.mm.yyyy'), -3)
GROUP BY
LAST_DAY(VALUE_DAY),
USER_ID
;
COMMIT;
END;
在更新表时,数据库用户无法使用最近 3 个月的数据。那么如何在更新过程中让表的用户可以使用最近 3 个月的旧版本数据呢?
我真的不想VISIT_HIST
每天在更新过程之前用另一个名字创建一个临时副本。很确定有一些更好的方法来解决我的问题。
任何帮助表示赞赏。