使用 Oracle 中的组函数安排 SQL 从实时 table 插入到另一个 table

Schedule a SQL INSERT from a live table to another table with a group function in Oracle

我正在尝试使用此 SQL:

从 2 table 秒中查询数据
SELECT m.site, round(avg(s.resptm),2) AS Avg_Response, 
       TO_DATE(TO_CHAR(s.starttm, 'YYYY-MM-DD HH24:')||TRUNC(TO_NUMBER(TO_CHAR(s.starttm,'MI'))/30,0)*30||':00', 'YYYY-MM-DD HH24:MI:SS') endtm 
FROM s
LEFT OUTER JOIN m
ON s.KEY = m.KEY
WHERE s.starttm >= sysdate - 1
GROUP BY m.site, TO_DATE(TO_CHAR(s.starttm, 'YYYY-MM-DD HH24:')||TRUNC(TO_NUMBER(TO_CHAR(s.starttm,'MI'))/30,0)*30||':00', 'YYYY-MM-DD HH24:MI:SS');

这个问题是,这是令人难以置信的慢,因为它平均执行 180 万条记录。考虑到这一点,我想创建一个新的 table 并插入以 10 分钟为基础的预平均记录(在时间范围内是灵活的)。问题是每隔几秒就会插入一次记录,我不想要重复的数据。有什么好的方法吗?

使用物化视图:

CREATE MATERIALIZED VIEW MVIEW_SCHEMA.AVERAGED_RECORDS
NOLOGGING 
REFRESH ON DEMAND
AS
SELECT m.site, round(avg(s.resptm),2) AS Avg_Response, 
       TO_DATE(TO_CHAR(s.starttm, 'YYYY-MM-DD HH24:')||TRUNC(TO_NUMBER(TO_CHAR(s.starttm,'MI'))/30,0)*30||':00', 'YYYY-MM-DD HH24:MI:SS') endtm 
FROM s
LEFT OUTER JOIN m
ON s.KEY = m.KEY
WHERE s.starttm >= sysdate - 1
GROUP BY m.site, TO_DATE(TO_CHAR(s.starttm, 'YYYY-MM-DD HH24:')||TRUNC(TO_NUMBER(TO_CHAR(s.starttm,'MI'))/30,0)*30||':00', 'YYYY-MM-DD HH24:MI:SS');

然后您可以随时刷新它(通过调度程序或 cron):

exec DBMS_SNAPSHOT.REFRESH('MVIEW_SCHEMA.AVERAGED_RECORDS');

这会在刷新视图时完成所有繁重的工作,而不是您选择它。

你似乎花了很多时间做这件事:

TO_DATE(TO_CHAR(s.starttm, 'YYYY-MM-DD HH24:')||TRUNC(TO_NUMBER(TO_CHAR(s.starttm,'MI'))/30,0)*30||':00', 'YYYY-MM-DD HH24:MI:SS') 

将此作为新列添加到您的 table 中,并且仅在插入记录时执行一次。

如果您每 15 分钟 运行 处理数百万行,那么这将为您每 15 分钟至少节省 400 万次计算或每分钟约 1/4 的一百万次计算。