Grandes volúmenes de datos Vistas materializadas bases de datos Vistas materializadas en Oracle Objeto de base de datos que almacena los resultados de una consulta. Es una vista pero no solo se almacena su definición, sino también los datos que devuelve. Estos datos deben ser refrescados. Se le pueden definir índices Se le puede especificar parámetros de almacenamiento como a una tabla (internamente es una tabla) 2 Vistas materializadas en Oracle Ventajas ◦ Su uso es transparente para las aplicaciones y los usuarios ◦ Evita realizar cálculos que requieren gran tiempo de ejecución en el momento de ejecución de la consulta Agregaciones (sum, avg, …) Joins complejos entre tablas ◦ Existe la posibilidad de que el optimizador de consultas reconozca automáticamente cuando existe una vista materializada que puede ser utilizada para resolver una consulta Re-escribe la consulta (QUERY REWRITE) Compara los planes de ejecución Elige el mejor 3 Vistas materializadas en Oracle Desventajas ◦ Ocupan espacio Tabla interna ◦ Necesitan de operaciones de refresco Actualización temporal (refrescos programados) Actualización instantánea (cada vez que se modifican los datos de origen) 4 Vistas materializadas en Oracle Sintaxis reducida CREATE MATERIALIZED VIEW [esquema.]vista [BUILD { IMMEDIATE | DEFERRED } [ REFRESH { FAST | COMPLETE | FORCE } { ON { DEMAND | COMMIT } | { START WITH | NEXT } date ] [ { DISABLE | ENABLE } QUERY REWRITE ] AS subquery ; DROP MATERIALIZED VIEW [esquema.]tabla [PRESERVE TABLE]; Sintaxis completa: http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6002.htm 5 Vistas materializadas en Oracle BUILD ◦ Immediate Opción por defecto Refresca los datos inmediatamente con la ejecución de la sentencia de creación ◦ Deferred La vista se crea vacía Los datos aparecerán en la siguiente operación de refresco 6 Vistas materializadas en Oracle REFRESH ◦ complete | fast | force Complete. Se ejecuta cada vez la query de la vista. Se borran todos los datos y se vuelven a calcular. Fast. Método de refresco incremental. Los cambios en las tablas que afectan a la vista se almacenan en un log asociado a la tabla El log de las tablas maestras de la vista han de crearse previo a la vista (create materialized view log on nombre_tabla ….) No permitido con BUILD DEFERRED Muchas restricciones sobre la sentencia de la vista. Para saber si una vista materializada puede utilizar el método FAST, el package DBMS_MVIEW proporciona el procedure EXPLAIN_MVIEW Force. Valor por defecto. Si puede rápido y si no completo 7 Vistas materializadas en Oracle REFRESH Demand | commit Commit. Refresco cada vez que una operación modifica alguna de las tablas maestras (sólo para tipo FAST) Demand. Valor por defecto. Bajo demanda. Una opción de refresco es utilizar uno de los procedimientos de refresco (DBMS_MVIEW) 8 Vistas materializadas en Oracle REFRESH Cuando es “on demand” también podemos dejar programados los refrescos con: start with | next Start with. Especifica una expresión temporal para el primer refresco Next. Especifica una expresión temporal para calcular el intervalo entre refrescos ORACLE automáticamente genera un JOB para estos refrescos 9 Vistas materializadas en Oracle Ejemplo se poblará en la siguiente operación de refresco CREATE MATERIALIZED VIEW mv_pedidos Refresco completo y bajo demanda llamando a BUILD DEFERRED procedimiento DBMS_MVIEW REFRESH COMPLETE ON DEMAND AS SELECT fech_pedi, esta_pedi, count(*) AS nume_pedi FROM pedidos GROUP BY fech_pedi, esta_pedi; DBMS_MVIEW.REFRESH( LIST => ‘MV_PEDIDOS' ,ATOMIC_REFRESH => FALSE); Podemos especificar una lista de vistas. Tiene otros parámetros. (ver manual) Forzamos un truncate en vez de un delete. Es más rápido aunque la vista aparece vacía hasta que no se finaliza el proceso. 10 Vistas materializadas en Oracle Ejemplo Refresco completo, automático cada siete días Comenzando 7 después de la creación de la vista CREATE MATERIALIZED VIEW mv_pedidos BUILD IMMEDIATE REFRESH complete NEXT sysdate + 7 AS SELECT * FROM pedidos; Podemos especificar parámetros de almacenamiento CREATE MATERIALIZED VIEW mv_pedidos TABLESPACE OTRAS_APP_DAT Se creará inicialmente vacia, el primer referesco STORAGE (INITIAL 50K NEXT 50K) será hoy a las 13 y todos los días a las 6:00 completo BUILD DEFERRED REFRESH COMPLETE START WITH ROUND(SYSDATE) + 13/24 NEXT ROUND(SYSDATE+1)+ 6/24 AS AS SELECT * FROM pedidos; 11 Vistas materializadas en Oracle Ejemplo create materialized view log on pedidos with primary key (fech_pedi, impo_pedi) Creamos el log de la tabla maestra. Almacenamos cambios en campos fecha e including new values; importe y los tenemos “localizados” por la primary key de pedidos create materialized view mv_pedidos refresh fast on demand as select count(*), sum(impo_pedi), to_char(fech_pedi, 'YYYY') from pedidos Cuando se produzca el refresco solo se refrescaran los datos modificados 12 Vistas materializadas en Oracle QUERY REWRITE ◦ El optimizador puede decidir, por razones de eficiencia, usar una vista materializada cuando se encuentra con una query en la que podría ser usada ◦ ENABLE: Indicamos que la vista es candidata ◦ DISBLE (por defecto) : Indicamos que la vista NO es candidata ◦ Se debe activar en la parametrización del ORACLE 13 Vistas materializadas en Oracle QUERY REWRITE (ejemplo) El optimizador decide usar la visa materializada 14