Grandes volúmenes de datos
Vistas materializadas en Oracle
Es una vista pero no sólo se almacena su definición,
sino también los datos que devuelve en una tabla
que el sistema crea de forma automática para ello.
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)
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 consunta
Re-escribe la consulta (QUERY REWRITE)
Compara los planes de ejecución
Vistas materializadas en Oracle
Desventajas
◦
Ocupan espacio
Tabla interna
◦
Necesitan de operaciones de refresco
Actualización manual
Actualización temporal (refrescos programados)
Actualización instantánea (cada vez que se
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:
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
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
Vistas materializadas en Oracle
REFRESH
Demand | commit | Start with
Demand. Valor por defecto. Bajo demanda.(manual) Una
opción de refresco es utilizar uno de los procedimientos de refresco (DBMS_MVIEW)
Commit. Refresco cada vez que una operación modifica
alguna de las tablas maestras (sólo para tipo FAST)
Start with .. next. 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
Vistas materializadas en Oracle
Ejemplo
CREATE MATERIALIZED VIEW mv_pedidos BUILD DEFERRED
REFRESH COMPLETE ON DEMAND AS
SELECT fech_pedi, esta_pedi, count(*) AS nume_pedi FROM pedidos
GROUP BY fech_pedi, esta_pedi; se poblará en
la siguiente operación de refresco
Refresco completo y bajo demanda llamando a procedimiento
DBMS_MVIEW
DBMS_MVIEW.REFRESH(
LIST => ‘MV_PEDIDOS'
,ATOMIC_REFRESH => FALSE); Podemos especificar una
lista de vistas. Forzamos un truncate en vez de un delete. Es más rápido aunque la vista Tiene otros parámetros.
Vistas materializadas en Oracle
Ejemplo
CREATE MATERIALIZED VIEW mv_pedidos BUILD IMMEDIATE
REFRESH complete NEXT sysdate + 7 AS SELECT * FROM pedidos;
Refresco completo, automático cada siete días Comenzando 7 después de la creación de la vista
CREATE MATERIALIZED VIEW mv_pedidos TABLESPACE OTRAS_APP_DAT
STORAGE (INITIAL 50K NEXT 50K) BUILD DEFERRED
REFRESH COMPLETE
START WITH ROUND(SYSDATE) + 13/24 NEXT ROUND(SYSDATE+1)+ 6/24 AS AS SELECT * FROM pedidos;
Podemos especificar parámetros de almacenamiento
Se creará inicialmente vacia, el primer referesco será hoy a las 13 y todos los días a las 6:00 completo
Vistas materializadas en Oracle
Ejemplo
Ejemplo completo
create materialized view log on pedidos with primary key, rowid, sequence(fech_pedi, impo_pedi)
including new values;
create materialized view mv_pedidos refresh fast on demand
as
select to_char(fech_pedi, 'YYYY'), sum(impo_pedi) from pedidos
group by to_char(fech_pedi, 'YYYY')
Creamos el log de la tabla maestra. En este caso tendrá la PK y el ROWID de la tabla origen y los campos “mapeados” de la vista destino donde se irán guardando los cambios pendientes
Cuando se produzca el refresco SOLO se refrescaran los datos modificados
El refresco se hará cuando nosotros lo provoquemos, si queremos que sea inmediato (al modificar datos fuente) debería ser ON COMMIT
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
Vistas materializadas en Oracle
QUERY REWRITE (ejemplo)
El optimizador decide
usar la visa materializada
Vistas del diccionario con información sobre Vistas
materializadas
user_mviews
user_MVIEW_REFRESH_TIMES
user_mview_logs
Etc (consultar manual)
Vistas materializadas en Oracle