Tengo una vista Materializada en Oracle que contiene una UNIÓN IZQUIERDA que lleva mucho tiempo actualizar. Cuando actualizo la tabla subyacente, se necesitan 63914.765 s para ejecutarse (sí, eso es casi 17 horas).Oracle - ACTUALIZACIÓN RÁPIDA Vistas materializadas con IZQUIERDAS se actualiza muy lento
Estoy utilizando un LEFT JOIN en la misma tabla, porque quiero pivotar los datos de las filas a las columnas. El comando pivote no está disponible en esta versión de Oracle, y no se permite el uso de GROUP BY + CASE en una vista materializada FAST REFRESH.
El materializada en Ver registro tiene el siguiente aspecto:
CREATE MATERIALIZED VIEW LOG ON Programmes_Titles
WITH PRIMARY KEY, rowid
INCLUDING NEW Values;
La misma vista materializada se parece a esto (que contiene 700.000 filas, la mesa Programmes_Titles contiene 900000 filas):
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'
La instrucción UPDATE Yo uso es esto:
UPDATE Programmes_Titles
SET Title = 'New title'
WHERE rowid = 'AAAL4cAAEAAAftTABB'
Esta declaración ACTUALIZADA ta kes 17 horas. Cuando se usa una UNIÓN INTERNA (eliminar las (+)) lleva milisegundos.
También traté de agregar ÍNDICES en la Vista Materializada de Mv_Web_Programmes, pero eso tampoco pareció ser de ayuda. (Todavía se ejecuta durante más de un minuto, que es una forma de ralentizar, no estoy esperando 17 horas después de cada cambio, por lo que podría mejorar la ACTUALIZACIÓN)
Así que mi pregunta es: ¿Por qué tarda tanto tiempo? ACTUALIZAR la tabla subyacente? ¿Cómo puedo mejorar esto?
Gracias, la solución sugerida funciona perfecto. Solo una pregunta adicional. En mi consulta de ejemplo, solo uso un único criterio en JOIN, pero mi consulta real usa dos. ¿Todavía puedo usar la función DECODE (esta es una nueva para mí o debería usar un CASE en su lugar?) – Tejo
Disculpa, estaba siendo un poco rápido. La tabla Programme_Titles se actualiza con el nuevo valor en un segundo, pero Mv_Web_Programmes no se actualiza, el valor anterior aún está allí. ¿Alguna idea? – Tejo
Debería poder usar CASE en lugar de DECODE, siempre que cada columna que use en su declaración CASE también esté en el registro MV. –