Mam zmaterializowany widok w Oracle, który zawiera LEWY DOŁĄCZ, co zajmuje bardzo dużo czasu na aktualizację. Kiedy aktualizuję tabelę bazową, potrzeba 63914.765 s (tak, to prawie 17 godzin).Oracle - SZYBKI ODŚWIEŻ Materialized views with LEFT JOINS aktualizacje bardzo powolne
Używam LEFT JOIN w tej samej tabeli, ponieważ chcę przestawić dane z wierszy do kolumn. Polecenie przestawne nie jest dostępne w tej wersji Oracle, a użycie funkcji GROUP BY + CASE nie jest dozwolone w widoku zmaterializowanym SZYBKIEGO ODŚWIEŻENIA.
zmaterializowanej View Log wygląda następująco:
CREATE MATERIALIZED VIEW LOG ON Programmes_Titles
WITH PRIMARY KEY, rowid
INCLUDING NEW Values;
zmaterializowanej sama View wygląda następująco (zawiera 700000 wiersze tabela Programmes_Titles zawiera 900000 wierszy):
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'
Instrukcja UPDATE Używam:
UPDATE Programmes_Titles
SET Title = 'New title'
WHERE rowid = 'AAAL4cAAEAAAftTABB'
Ta instrukcja UPDATE kes 17 godzin. Gdy używasz INNER JOIN (usuń (+)), zajmuje to milisekundy.
Próbowałem również dodawać INDEXES w zmaterializowanym widoku Mv_Web_Programmes, ale to też nie pomagało. (Ciągle trwa dłużej niż minutę, co jest powolne, nie czekam 17 godzin po każdej zmianie, więc może poprawić AKTUALIZACJĘ)
Moje pytanie brzmi: dlaczego zajmuje tak dużo czasu AKTUALIZOWAĆ podstawową tabelę? Jak mogę to poprawić?
Dziękuję, sugerowane rozwiązanie działa idealnie. Tylko jedno dodatkowe pytanie. W moim przykładowym zapytaniu używam tylko jednego kryterium w JOIN, ale moje prawdziwe zapytanie używa dwóch. Czy nadal mogę korzystać z funkcji DECODE (jest to dla mnie nowe, czy zamiast tego powinienem użyć CASE?) – Tejo
Przepraszam, byłem trochę szybki. Tabela programu Programme_Titles jest aktualizowana o nową wartość poniżej sekundy, ale Mv_Web_Programmes nie jest aktualizowany, stara wartość nadal istnieje. Jakieś pomysły? – Tejo
Powinieneś być w stanie używać CASE zamiast DECODE, o ile każda kolumna, której używasz w swoim CASE, również znajduje się w logu MV. –