Oracle - FAST REFRESH Материализованные представления с LEFT JOINS обновляются очень медленно

У меня есть Материализованное представление в Oracle, которое содержит ЛЕВОЕ СОЕДИНЕНИЕ, обновление которого занимает очень много времени. Когда я обновляю базовую таблицу, запускается 63914,765 с (да, это почти 17 часов).

Я использую ЛЕВОЕ СОЕДИНЕНИЕ в той же таблице, потому что я хочу перемещать данные из строк в столбцы. Команда pivot недоступна в этой версии Oracle, а использование GROUP BY + CASE недопустимо в материализованном представлении FAST REFRESH.

Журнал материализованного представления выглядит следующим образом:

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 (удалите (+)) это занимает миллисекунды.

Я также пробовал добавить INDEXES в материализованное представление Mv_Web_Programmes, но это тоже не помогло. (Он по-прежнему работает более минуты, что очень медленно, я не жду 17 часов после каждого изменения, поэтому он может улучшить ОБНОВЛЕНИЕ)

Итак, мой вопрос: почему это занимает так много времени, чтобы ОБНОВИТЬ базовую таблицу? Как я могу это улучшить?

5
задан Tejo 21 November 2011 в 09:58
поделиться