Existen diferentes herramientas en las BD relacionales para la exploración y manejo de datos que pueden mejorar la organización y seguridad de la información, una de ellas son las vistas materializadas.
Pero que es una Vista Materializada? Podemos definirla como una consulta almacenada, que además almacena los datos que retorna y que se actualiza periódicamente de acuerdo a lo definido.
Es importante recordar que una vista no guarda datos solo almacena la consulta para acceder a los datos.
¿Cuando o Por qué usar una vista materializada?
Una de las razones que nos pueden llevar a utilizar vistas materializadas es la Seguridad, por ejemplo cuando tenemos información a la que ciertos usuarios no deben acceder y solamente formamos un conjunto de datos para esos usuarios.
Otro motivo puede ser la estructura de modelo de datos ya que puede ser más útil crear estas vistas para organizar mejor la información.
Así también podemos utilizarla cuando requerimos por ejemplo la distribución de datos filtrados y/o Procesamiento peridoco por lotes.
DEFINIR UNA VISTA MATERIALIZADA
Para este tipo de vistas se realiza una carga inicial de datos y estos se actualizan de acuerdo a la frecuencia que se define.
La sentencia en SQL para definirla es CREATE MATERIAKIZED VIEW, ejemplo:
CREATE MATERIALIZED VIEW nombre_vista
[TABLESPACE nombre_ts]
[PARALELL (DEGREE n)]
[BUILD {INMEDIATE|DEFERRED}]
[REFRESH {FAST|COMPLETE|FORCE|NEVER}|{ON COMMIT|ON DEMAND|[START WITH fecha_inicio] NEXT intervalo}]
[{ENABLE|DISABLE} QUERY REWRITE]
AS SELECT ...
FROM ...
WHERE …
Parametros
BUILD:Establece la forma de carga de datos de la vista.
- INMEDIATE (opción por defecto) se cargan los datos después de crear la vista
- DEFERRED Se define la vista con sentencia SQL sin cargar ningún dato.Los Datos se cargan hasta el primer refresh
REFRESH: Define el método de frecuencia de refresco de datos.
QUERY REWRITE: Indica si queremos optimizar nuestra base de datos para reescribir la consulta.
Mas detalles.
REFRESCAR UNA VISTA MATERIALIZADA
Existen varios tipos de refresco, elegir cuál utilizar depende de las necesidades como la frecuencia de actualización de las tablas bases.
Tipos de refresco
COMPLETE: Esta implica el borrado de todos los datos de la vista, se vuelve a ejecutar la consulta por lo que se recargan los datos desde las tablas base. Se recomienda utilizar cuando una parte considerable de la base a cambiado.
FAST: Se considera una actualización, por lo que solo se refrescaran aquellos datos que se hayan modificado desde el ultimo refresh. Este puede ser de dos formas:
- View Log:Los cambios sobre las tablas base se guardan en estos Log y son lo que se aplican al refrescar la Vista Materializada.
Estos Log deben ser creados en cada tabla base (CREATE MATERIALIZED VIEW LOG)
CREATE MATERIALIZED VIEW LOG ON tabla_base
WITH PRIMARY KEY INCLUDING NEW VALUES
Es importante saber que no todas las vistas materializadas soportan este tipo de refresh ya que si en el SQL se usa funciones como SUM, AVG,MAX,MIN,COUNT no admiten este refresh
FORCE: Si no se selecciona un tipo de refresh esta es la opcion por default. Primero intenta un FAST REFRESH y si no es posible realiza un COMPLETE.
NEVER: No se actualiza la vista materializada.
Formas de refresco
Existen dos formas de refrescar una vista materializada de acuerdo al tiempo elegido para hacerlo.
Refresco Manual: Utilizando el paquete PL/SQL DBMS_MVIEW este contiene funciones y procedimientos PLSQL para gestionar las vistas.
DBMS_MVIEW.REFRESH (‘nombre_vista’);
- REFRESH_DEPENDENT: Refresca todas las vistas materializadas que tengan como base las tablas colocadas como parametro
- DBMS_MVIEW.REFRESH_DEPENDENT (‘tabla1, tabla2, tabla3, … , tablaN’);
- REFRESH_ALL_MVIEWS Refresca todas las vistas de la Base de Datos.DBMS_MVIEW.REFRESH_ALL_MVIEWS (n)
- devuelve el numero de registros actualizados
REFRESCO AUTOMATICO: Se puede realizar de dos formas.
- ON COMMIT: La vista materializada se refresca cuando se realiza un commit sobre las tablas base.
- ON DEMAND: Refresco programado en este podemos definir el momento en que requerimos que se actualice la vista.
Una vista se puede programar para que se refresque todos los días a cierta hora usando las cláusulas START WITH (seguido de la hora en formato datetime) y NEXT (seguido de una expresión en formato datetime que se utilizará para calcular el intervalo entre refrescos automáticos).
Ejemplo. En la siguiente declaracion se indica que se cree una Vista Materializada, a las 6:00 PM y actualizar todos los domingos a las 2:00 PM
CREATE MATERIALIZED VIEW EDWCM.MV_CLV_RESULT_WKLY
TABLESPACE EDWCM_DATA PARALLEL 8
BUILD IMMEDIATE BUILD DEFERRED REFRESH COMPLETE
START WITH ( TRUNC (SYSDATE) + 18/24 )NEXT ( NEXT_DAY(TRUNC(SYSDATE), 'SUNDAY') + 14/24 ) AS [QUERY];
Espero que esta información básica sobre vista materializada sea de utilidad para comenzar con el manejo de esta alternativa.