1. Documentación en Tahiti -> Masters Book List -> Data Warehousing Guide -> 9 Basic Materialized Views
2. Este objetivo nos demanda que conozcamos el procedimiento para crear una vista materializada en un entorno distribuido, esto es, crear una MVIEW en una BD distinta a la BD donde está la/s tabla/s maestra/s. Para ello, es necesario crear un DATABASE LINK para poder acceder a las tablas maestras, y luego el resto del procedimiento es prácticamente idéntico.
Vamos a utilizar la tabla EMPLOYEES del esquema HR en la BD OCM para crear una MVIEW en la BD de OEM. Este es el resumen de los pasos:
· Instalamos esquema HR en la BD de OCM
· Creamos una MVIEW LOG en la tabla EMPLOYEES (BD OCM)
· Creamos un DB LINK en la BD de OEM apuntando (BD OEM)
· Creamos la MVIEW de réplica de la tabla EMPLOYESS (BD OEM)
# Primero creamos el schema de ejemplo HR sino lo tenemos en la BD De OCM
cd $ORACLE_HOME/demo/schema/human_resources
-- Ejecutamos el script de creación del esquema HR
SQL> @hr_main.sql
specify password for HR as parameter 1:
Enter value for 1: hr
specify default tablespeace for HR as parameter 2:
Enter value for 2: USERS
specify temporary tablespace for HR as parameter 3:
Enter value for 3: TEMP
specify password for SYS as parameter 4:
Enter value for 4: ************
specify log path as parameter 5:
Enter value for 5: /tmp/
# Creamos el DB LINK en la BD de OEM
# Lo primero es añadir la entrada OCM al fichero tnsnames.ora si no la tenemos
vi $ORACLE_HOME/network/admin/tnsnames.ora
# Añadimos estas lineas
OCM=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=ocm.dbajunior.com)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=OCM)))
# Comprobamos que tenemos conectividad
tnsping ocm
-- Creamos la MVIEW LOG sobre la tabla EMPLOYEES
CREATE MATERIALIZED VIEW LOG ON EMPLOYEES;
-- Creamos el DB LINK
CREATE PUBLIC DATABASE LINK OCM CONNECT TO HR IDENTIFIED BY "hr" USING 'OCM';
-- Probamos la conectividad
SELECT COUNT(*) FROM EMPLOYEES@OCM;
-- Creamos la MVIEW EMP apuntando a la tabla EMPLOYEES
CREATE MATERIALIZED VIEW EMP REFRESH FAST AS
SELECT * FROM EMPLOYEES@OCM;
-- Probamos el Fast Refresh
EXEC DBMS_MVIEW.REFRESH('EMP','F');
3. Una funcionalidad pendiente que nos habíamos dejado y puede resultar interesante consiste en los grupos de refresco (Materalized View Refresh Group). Podemos crear un grupo de vistas materializadas y refrescarlas de forma conjunta para que los datos sean consistentes entre ellos.
-- Creamos una MVIEW LOG en la tabla DEPARTMENTS (BD OCM)
CREATE MATERIALIZED VIEW LOG ON DEPARTMENTS;
-- Creamos una segunda vista materializada en la BD de OEM
CREATE MATERIALIZED VIEW DEP REFRESH FAST AS
SELECT * FROM DEPARTMENTS@OCM;
-- Creamos el grupo de refresco
-- La información se puede consultar en estas dos vistas
-- · DBA_REFRESH
-- · DBA_REFRESH_CHILDREN
BEGIN
DBMS_REFRESH.MAKE (
NAME => 'REFRESH_GROUP_TEST',
LIST => 'EMP,DEP',
NEXT_DATE => SYSDATE,
INTERVAL => 'SYSDATE+1/1440',
IMPLICIT_DESTROY => TRUE);
END;
/
-- Limpiamos el entorno (OEM)
EXEC DBMS_REFRESH.DESTROY('REFRESH_GROUP_TEST');
DROP MATERIALIZED VIEW EMP;
DROP MATERIALIZED VIEW DEP;
DROP PUBLIC DATABASE LINK OCM;
-- Borramos las MVIEW LOG en OCM
DROP MATERIALIZED VIEW LOG ON EMPLOYEES;
DROP MATERIALIZED VIEW LOG ON DEPARTMENTS;