【发布时间】:2017-07-18 15:00:30
【问题描述】:
假设我有两个表job 和batch:
CREATE TABLE batch
(
batch_id NUMBER(20) PRIMARY KEY,
batch_type NUMBER(20),
[some other values] ...
);
CREATE TABLE job
(
job_id NUMBER(20) PRIMARY KEY,
job_batch_id NUMBER(20),
job_usr_id NUMBER(20),
job_date DATE,
[some other values] ...
CONSTRAINT fk_job_batch
FOREIGN KEY (job_batch_id) REFERENCES batch(batch_id),
CONSTRAINT fk_job_usr
FOREIGN KEY (job_usr_id) REFERENCES client(usr_id)
);
假设它们每个都包含大量数据(数百万行)。我想要做的是创建一个物化视图,以反映每个usr_id 为特定类型的批处理运行的第一个和最后一个作业。例如:
CREATE MATERIALIZED VIEW client_first_last_job
(usr_id, first_job_date, last_job_date)
AS
(
SELECT
job_usr_id AS usr_id,
MIN(job_date) AS first_job_date,
MAX(job_date) AS last_job_date
FROM job, batch
WHERE job_batch_id=batch_id
AND batch_type IN (1,3,5,9)
GROUP BY job_usr_id
);
这一切都很好,但是由于记录太多,构建这个物化视图需要很长时间(远远超过每次需要刷新时处理的时间)。我的直接想法是使用物化视图日志进行增量更新。这些很容易创建。但是当我尝试构建 MV 以使用 REFRESH FAST ON DEMAND 时,我得到了一个 ORA-12015: cannot create a fast refresh materialized view from a complex query 错误,从一些谷歌搜索中我猜这是由于连接和聚合函数的共存。
还有其他方法可以做到这一点吗?请注意,对父表进行非规范化或其他更改是不可行的。
【问题讨论】:
-
我很好奇非原子完全刷新是否会足够快地刷新以满足您的需求: exec dbms_mview.refresh('CLIENT_FIRST_LAST_JOB', 'C', atomic_refresh => false);以防万一您不知道它的限制,非原子刷新有一个显着的缺点,即在刷新过程中表可能会显示为空(甚至对于其他用户和会话)。但是,它会运行得更快,因为它执行 truncate + insert append;与执行删除 + 插入的常规完整刷新相反。