我在 Oracle 中有一个物化视图,其中包含一个需要很长时间才能更新的 LEFT JOIN。当我更新基础表时,它需要 63914.765 秒才能运行(是的,差不多 17 小时)。
我在同一张表上使用 LEFT JOIN,因为我想将数据从行旋转到列。透视命令在此 Oracle 版本中不可用,并且不允许在 FAST REFRESH 物化视图上使用 GROUP BY + CASE。
物化视图日志如下所示:
CREATE MATERIALIZED VIEW LOG ON Programmes_Titles
WITH PRIMARY KEY, rowid
INCLUDING NEW Values;
物化视图本身看起来像这样(它包含 700000 行,Programmes_Titles 表包含 900000 行):
CREATE MATERIALIZED VIEW Mv_Web_Programmes
REFRESH FAST ON COMMIT
AS
SELECT
t1.ProgrammeId,
t1.Title as MainTitle,
t2.Title as SecondaryTitle,
--Primary key
t1.Title_Id as t1_titleId,
t2.Title_Id as t2_titleId,
t1.rowid as t1_rowid,
t2.rowid as t2_rowid
FROM
Programmes_Titles t1,
Programmes_Titles t2
WHERE
t1.Titles_Group_Type = 'mainTitle'
AND t1.Programme_Id = t2.Programme_Id(+) AND t2.Titles_Group_Type(+) = 'secondaryTitle'
我使用的 UPDATE 语句是这样的:
UPDATE Programmes_Titles
SET Title = 'New title'
WHERE rowid = 'AAAL4cAAEAAAftTABB'
此 UPDATE 语句需要 17 小时。使用 INNER JOIN(删除(+))时,需要几毫秒。
我还尝试在 Mv_Web_Programmes 物化视图上添加 INDEXES,但这似乎也没有帮助。(它仍然运行超过一分钟,这很慢,我不会在每次更改后等待 17 小时,所以它可能会改进 UPDATE)
所以我的问题是:为什么要花这么长时间来更新基础表?我该如何改进呢?