我在Oracle中有一個包含LEFT JOIN的物化視圖,需要很長時間才能更新。當我更新底層表時,需要運行63914.765秒(是的,差不多17小時)。Oracle - 快速刷新帶有左連接的物化視圖更新非常慢
我在同一張表上使用了LEFT JOIN,因爲我想將數據從行轉移到列。在此Oracle版本中,pivot命令不可用,並且在FAST REFRESH物化視圖上不允許使用GROUP BY + CASE。
物化視圖日誌看起來是這樣的:
CREATE MATERIALIZED VIEW LOG ON Programmes_Titles
WITH PRIMARY KEY, rowid
INCLUDING NEW Values;
物化視圖本身看起來像這樣(包含70萬行,在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語句ta kes 17個小時。 使用INNER JOIN(刪除(+))時,需要幾毫秒。
我也嘗試在Mv_Web_Programmes物化視圖中添加INDEXES,但這似乎也沒有幫助。 (它仍然運行超過一分鐘,這是緩慢的方式,我不等待17小時後,每次更改,所以它可能會改善更新)
所以我的問題是:爲什麼需要這麼長時間更新底層表?我該如何改進?
謝謝,建議的解決方案工作完美。還有一個問題。在我的示例查詢中,我只在JOIN中使用單個條件,但我真正的查詢使用了兩個。我仍然可以使用DECODE功能(這對我來說是新的,還是應該使用CASE?) – Tejo
對不起,我有點快。 Programme_Titles表在一秒鐘內獲得新值,但Mv_Web_Programmes不更新,舊值仍然存在。 任何想法? – Tejo
只要您在CASE語句中使用的每一列都在MV日誌中,您就應該可以使用CASE而不是DECODE。 –