У меня есть Материализованное представление в 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 часов после каждого изменения, поэтому он может улучшить ОБНОВЛЕНИЕ)
Итак, мой вопрос: почему это занимает так много времени, чтобы ОБНОВИТЬ базовую таблицу? Как я могу это улучшить?