vista modificar materializada entre diferencia sql database oracle oracle11g

sql - modificar - diferencia entre vista y vista materializada oracle



Oracle: cómo crear una vista materializada con FAST REFRESH y JOINS (4)

¿Lo has intentado sin la unión de ANSI?

CREATE MATERIALIZED VIEW MV_Test NOLOGGING CACHE BUILD IMMEDIATE REFRESH FAST ON COMMIT AS SELECT V.*, P.* FROM TPM_PROJECTVERSION V,TPM_PROJECT P WHERE P.PROJECTID = V.PROJECTID

Así que estoy bastante seguro de que Oracle lo admite, así que no tengo idea de lo que estoy haciendo mal. Este código funciona:

CREATE MATERIALIZED VIEW MV_Test NOLOGGING CACHE BUILD IMMEDIATE REFRESH FAST ON COMMIT AS SELECT V.* FROM TPM_PROJECTVERSION V;

Si agrego un JOIN, se rompe:

CREATE MATERIALIZED VIEW MV_Test NOLOGGING CACHE BUILD IMMEDIATE REFRESH FAST ON COMMIT AS SELECT V.*, P.* FROM TPM_PROJECTVERSION V INNER JOIN TPM_PROJECT P ON P.PROJECTID = V.PROJECTID

Ahora me sale el error:

ORA-12054: no se puede establecer el atributo de actualización ON COMMIT para la vista materializada

Creé registros de vista materializados tanto en TPM_PROJECT como en TPM_PROJECTVERSION. TPM_PROJECT tiene una clave principal de PROJECTID y TPM_PROJECTVERSION tiene una clave primaria compuesta de (PROJECTID, VERSIONID). ¿Cuál es el truco para esto? He estado buscando en los manuales de Oracle en vano. ¡Gracias!


Las verificaciones de teclas para ACTUALIZAR RÁPIDAMENTE incluyen lo siguiente:

1) An Oracle materialized view log must be present for each base table. 2) The RowIDs of all the base tables must appear in the SELECT list of the MVIEW query definition. 3) If there are outer joins, unique constraints must be placed on the join columns of the inner table.

No 3 es fácil de perder y vale la pena destacar aquí


Obtendrá el error en REFRESH_FAST, si no crea registros de vista materializados para las tablas maestras a las que hace referencia la consulta. Si alguien no está familiarizado con las vistas materializadas o lo usa por primera vez, la mejor manera es usar Oracle sqldeveloper y poner gráficamente las opciones, y los errores también proporcionan mucho mejor sentido.


Para empezar, desde la Guía de Oracle Database Data Warehousing :

Restricciones en actualización rápida en vistas materializadas con combinaciones solo

...

  • Los rowids de todas las tablas en la lista FROM deben aparecer en la lista SELECT de la consulta.

Esto significa que su afirmación deberá verse más o menos así:

CREATE MATERIALIZED VIEW MV_Test NOLOGGING CACHE BUILD IMMEDIATE REFRESH FAST ON COMMIT AS SELECT V.*, P.*, V.ROWID as V_ROWID, P.ROWID as P_ROWID FROM TPM_PROJECTVERSION V, TPM_PROJECT P WHERE P.PROJECTID = V.PROJECTID

Otro aspecto clave a tener en cuenta es que sus registros de vista materializados deben crearse como with rowid .

A continuación se muestra un escenario de prueba funcional:

CREATE TABLE foo(foo NUMBER, CONSTRAINT foo_pk PRIMARY KEY(foo)); CREATE MATERIALIZED VIEW LOG ON foo WITH ROWID; CREATE TABLE bar(foo NUMBER, bar NUMBER, CONSTRAINT bar_pk PRIMARY KEY(foo, bar)); CREATE MATERIALIZED VIEW LOG ON bar WITH ROWID; CREATE MATERIALIZED VIEW foo_bar NOLOGGING CACHE BUILD IMMEDIATE REFRESH FAST ON COMMIT AS SELECT foo.foo, bar.bar, foo.ROWID AS foo_rowid, bar.ROWID AS bar_rowid FROM foo, bar WHERE foo.foo = bar.foo;