2010-01-08 10 views
10

He una vista materializada definida de esta manera:Actualización vista materializada cuando las tablas urderlying cambian

CREATE MATERIALIZED VIEW M_FOO 
REFRESH COMPLETE ON COMMIT 
AS 
    SELECT FOO_ID, BAR 
    FROM FOO 
    WHERE BAR IS NOT NULL 
    GROUP BY FOO_ID, BAR 
/

COMMENT ON MATERIALIZED VIEW M_FOO IS 'Foo-Bar pairs'; 

escribí como una especie de caché: la tabla de origen es enorme, pero el número de diferentes pares es bastante pequeño. Necesito esos pares para unirlos con otras tablas. Hasta ahora todo bien: acelera las consultas.

Pero quiero asegurarme de que la vista no contenga datos obsoletos. La tabla subyacente se modifica cuatro o cinco veces por mes, pero no necesariamente sé cuándo. Entiendo que se puede definir una vista materializada para que se actualice cuando cambien las tablas fuente. Sin embargo, los documentos se complican bastante.

  1. ¿Cuál es la sintaxis exacta que necesito uso?

  2. ¿Necesito crear un registro de visualización materializado?

  3. ¿Cuál es la diferencia entre fast y actualización completa?

Respuesta

18

a sus preguntas en el orden inverso

Una actualización rápida también se conoce como una actualización gradual. Eso debería darte una pista sobre la diferencia. Una actualización COMPLETA reconstruye todo el MVIEW desde cero, mientras que una actualización RÁPIDA aplica solo los cambios de DML en comparación con la mesa (s) de alimentación.

Para poder ejecutar actualizaciones RÁPIDAS, necesita el REGISTRO DE VISTA MISMO apropiado.

En cuanto a la sintaxis, bien aquí están los fundamentos:

SQL> create materialized view log on emp 
    2 with rowid, primary key, sequence (deptno, job) 
    3 including new values 
    4/

Materialized view log created. 

SQL> create materialized view emp_mv 
    2 refresh fast on commit 
    3 as 
    4 select deptno, job from emp 
    5 group by deptno, job 
    6/

Materialized view created. 

SQL> 

La cláusula ON COMMIT significa que el MVIEW se actualiza transaccionalmente (en contraposición a ON DEMAND que es renovación regular a granel). Las cláusulas REFRESH especifican si se deben aplicar actualizaciones incrementales o completas. Hay algunas categorías de consulta que fuerzan el uso de la actualización COMPLETE, aunque estas parecen disminuir con cada nueva versión de Oracle.

Una prueba rápida para ver que funciona ...

SQL> select * from emp_mv 
    2 order by deptno, job 
    3/

    DEPTNO JOB 
---------- --------- 
     10 MANAGER 
     10 PRESIDENT 
     10 SALES 
     20 ANALYST 
     20 CLERK 
     20 MANAGER 
     30 CLERK 
     30 MANAGER 
     30 SALESMAN 
     40 CLERK 
     40 DOGSBODY 

11 rows selected. 

SQL> 

¿Qué tal un nuevo disco?

SQL> insert into emp (empno, ename, deptno, job) 
    2 values (6666, 'GADGET', 40, 'INSPECTOR') 
    3/

1 row created. 

SQL> commit 
    2/

Commit complete. 

SQL> select * from emp_mv 
    2 order by deptno, job 
    3/

    DEPTNO JOB 
---------- --------- 
     10 MANAGER 
     10 PRESIDENT 
     10 SALES 
     20 ANALYST 
     20 CLERK 
     20 MANAGER 
     30 CLERK 
     30 MANAGER 
     30 SALESMAN 
     40 CLERK 
     40 DOGSBODY 

12 rows selected. 

SQL> 

Puede encontrar más detalles sobre la sintaxis en the SQL Reference. También vale la pena leer el Materialized View chapter in the Data Warehousing Guide.

+0

Gracias, creo que finalmente obtuve el concepto. La parte ON COMMIT habilita las actualizaciones y la parte REFRESH ajusta el método. Solo necesito un registro de vista materializado para una actualización rápida. –

+0

El resultado dice 12 filas seleccionadas, pero contar a mano solo da como resultado 11 ... –

6

Una actualización rápida solo insertará/actualizará/eliminará los datos modificados en la vista materializada. Una actualización completa vaciará la vista materializada y luego copiará sobre todas las filas.

La "confirmación de activación" significa que la vista materializada se actualizará cada vez que se realice un cambio en la tabla maestra. Por lo tanto, su sintaxis actual será extremadamente ineficiente. Cada vez que alguien cambie cualquier fila en foo, m_foo se truncará y luego se insertará cada fila en la tabla foo.

Puede mejorar con actualizaciones rápidas, donde solo las filas modificadas en foo se enviarán a m_foo. Eso le da consistencia sin muchos gastos generales.

crear vista materializada iniciar sesión foo con clave principal; - suponiendo que tiene una clave principal, debe crear vista materializada m_foo actualizar rápidamente en confirmar como \;

Hay algunas sutilezas adicionales con concesiones y sinónimos si está utilizando enlaces de base de datos, o el esquema que posee foo no es el que posee m_foo.

+0

Tu respuesta también es excelente, pero solo puedo elegir una. Gracias. –

+0

si la fuente es una vista, ¿admite la actualización rápida? –

Cuestiones relacionadas