- INTRODUCCION
Una vista no es más que una consulta almacenada a fin de utilizarla tantas veces como se desee. Una vista no contiene datos sino la instrucción SELECT necesaria para crear la vista, eso asegura que los datos sean coherentes al utilizar los datos almacenados en las tablas. Por todo ello, las vistas gastan muy poco espacio de disco.
Las vistas se emplean para:
♦ Realizar consultas complejas más fácilmente, ya que permiten dividir la consulta en varias partes
♦ Proporcionar tablas con datos completos
♦ Utilizar visiones especiales de los datos
♦ Ser utilizadas como tablas que resumen todos los datos
♦ Ser utilizadas como cursores de datos en los lenguajes procedimentales (como PL/SQL)
Sintaxis:
CREATE [OR REPLACE] [FORCE|NOFORCE
[(alias[, alias2...])] ] VIEW vista
AS consultaSELECT
[WITH CHECK OPTION [CONSTRAINT restricción]]
[WITH READ ONLY [CONSTRAINT restricción]]
♦ OR REPLACE. Si la vista ya existía, la cambia por la actual
♦ FORCE. Crea la vista aunque los datos de la consulta SELECT no existan
♦ vista. Nombre que se le da a la vista
♦ alias. Lista de alias que se establecen para las columnas devueltas por la consulta SELECT en la que se basa esta vista. El número de alias debe coincidir con el número de columnas devueltas por SELECT.
♦ WITH CHECK OPTION. Hace que sólo las filas que se muestran en la vista puedan ser añadidas (INSERT) o modificadas (UPDATE). La restricción que sigue a esta sección es el nombre que se le da a esta restricción de tipo CHECK OPTION.
♦ WITH READ ONLY. Hace que la vista sea de sólo lectura. Permite grabar un nombre para esta restricción.
Lo bueno de las vistas es que tras su creación se utilizan como si fueran una tabla.
- VISTA SENCILLA
Create view vista
as
select * from alumnos;
- VISTA COMPLEJA
CREATE VIEW resumen
/* alias */
(id_localidad, localidad, poblacion, n_provincia, provincia,superficie, capital_provincia, id_comunidad, comunidad, capital_comunidad)
AS
( SELECT l.id_localidad, l.nombre, l.poblacion,
n_provincia, p.nombre, p.superficie, l2.nombre,
id_comunidad, c.nombre, l3.nombre
FROM localidades l
JOIN provincias p USING (n_provincia)
JOIN comunidades c USING (id_comunidad)
JOIN localidades l2 ON (p.id_capital=l2.id_localidad)
JOIN localidades l3 ON (c.id_capital=l3.id_localidad)
);
/* alias */
(id_localidad, localidad, poblacion, n_provincia, provincia,superficie, capital_provincia, id_comunidad, comunidad, capital_comunidad)
AS
( SELECT l.id_localidad, l.nombre, l.poblacion,
n_provincia, p.nombre, p.superficie, l2.nombre,
id_comunidad, c.nombre, l3.nombre
FROM localidades l
JOIN provincias p USING (n_provincia)
JOIN comunidades c USING (id_comunidad)
JOIN localidades l2 ON (p.id_capital=l2.id_localidad)
JOIN localidades l3 ON (c.id_capital=l3.id_localidad)
);
SELECT DISTINCT (comunidad, capital_comunidad)
FROM resumen; /* La vista pasa a usarse como una tabla normal
- VISTA MATERIALIZADA
El SQL de las bases de datos Oracle permite crear vistas materializadas o materialized views. Estas vistas materializadas, a parte de almacenar la definición de la vista propiamente dicha, también almacenan los registros que resultan de la ejecución de la sentenciaSELECT que define la vista. Como las vistas normales, la sentencia SELECT es la base de la vista, pero la sentencia SQL se ejecuta cuando se crea la vista y los resultados se almacenan físicamente constituyendo una tabla real que ocupa sitio en el disco duro. Esta tabla puede definirse utilizando los mismos parámetros de almacenamiento que se pueden utilizar para una tabla normal (tablespace, etcétera). Las vistas materializadas también admiten índices, esta funcionalidad resulta muy útil a la hora de mejorar el rendimiento de las sentencias PLSQL o SQL que utilicen vistas materializadas.
Cuando una sentencia SQL o PL/SQL accede a una vista materializada el servidor de la base de datos Oracle, transforma la sentencia dirigiéndose directamente a los datos de la vista que están ya almacenados, en lugar de utilizar los datos de las diferentes tablas utilizadas en la definición de dicha vista.
Evidentemente, si una vista (view) utiliza muchas tablas base enlazadas de forma compleja, y dicha vista va a ser utilizada frecuentemente, será muy conveniente definirla como una vista materializada o materialized view. Esto contribuirá enormemente a mejorar el rendimiento de la base de datos, ya que la sentencia SQL base de la vista sólo se ejecutará una vez.
Por otro lado, está el inconveniente de que si la vista materializada o materialized view va a tener que reutilizarse en el futuro, entonces necesitaremos un mecanismo para actualizar o refrescar dicha vista materializada, ya que las tablas base de la vista pueden haber sufrido modificaciones desde la creación de la misma.
Por todo esto, a la hora de determinar si una vista debe definirse como vista o es mejor definirla como vista materializada, debemos valorar los costes de tener que ejecutar la sentencia SQL base de una vista normal siempre que se acceda a dicha vista, frente a los costes de almacenamiento y actualización de una vista materializada.
Cuando una sentencia SQL o PL/SQL accede a una vista materializada el servidor de la base de datos Oracle, transforma la sentencia dirigiéndose directamente a los datos de la vista que están ya almacenados, en lugar de utilizar los datos de las diferentes tablas utilizadas en la definición de dicha vista.
Evidentemente, si una vista (view) utiliza muchas tablas base enlazadas de forma compleja, y dicha vista va a ser utilizada frecuentemente, será muy conveniente definirla como una vista materializada o materialized view. Esto contribuirá enormemente a mejorar el rendimiento de la base de datos, ya que la sentencia SQL base de la vista sólo se ejecutará una vez.
Por otro lado, está el inconveniente de que si la vista materializada o materialized view va a tener que reutilizarse en el futuro, entonces necesitaremos un mecanismo para actualizar o refrescar dicha vista materializada, ya que las tablas base de la vista pueden haber sufrido modificaciones desde la creación de la misma.
Por todo esto, a la hora de determinar si una vista debe definirse como vista o es mejor definirla como vista materializada, debemos valorar los costes de tener que ejecutar la sentencia SQL base de una vista normal siempre que se acceda a dicha vista, frente a los costes de almacenamiento y actualización de una vista materializada.
Sintaxis del comando SQL utilizado para crear vistas materializadas
CREATE MATERIALIZED VIEW nombre_vistam
[TABLESPACE nombre_ts]
[PARALELL (DEGREE n)]
[BUILD {INMEDIATE|DEFERRED}]
[REFRESH {FAST|COMPLETE|FORCE|NEVER|ON COMMIT}]
[{ENABLE|DISABLE} QUERY REWRITE]
AS SELECT ... FROM ... WHERE ...
Los valores por defecto de las distintas opciones están subrayados.
Si se elige la opción BUILD INMEDIATE, entonces la tabla asociada con la vista materializada se puebla con datos en el momento de la ejecución del comando SQLCREATE. Por el contrario, si se utiliza BUILD DEFERRED, el comando CREATEcreará sólo la estructura de la vista, pero la tabla física asociada no se poblará con datos hasta que se realice el primer refresco o actualización de la vista materializada.
La opción REFRESH permite indicar el mecanismo que la base de datos utilizará para refrescar o actualizar la vista materializada. Los diferentes mecanismos y la forma en que una vista materializada o materialized view puede refrescarse, serán objeto de otro artículo en este blog. Como anticipo diré que un refresco completo o COMPLETE, significa que la tabla asociada con la vista materializada se borra completamente, volviéndose a insertar todos los registros devueltos por la ejecución de la sentencia SQL base de la vista, y que un refresco rápido o FAST, significa que la vista materializada se actualiza sólo según hayan sido los cambios realizados sobre las tablas base de la vista desde el último refresco. Para poder utilizar el refresco rápido oFAST, hay que crear previamente los logs de la vista materializada utilizando el comando CREATE MATERIALIZED VIEW LOG.
La opción ENABLE/DISABLE QUERY REWRITE determina si el optimizador Oraclepuede o no reescribir las sentencias SQL de manera que, de ser posible, en la fase de ejecución se utilice la vista materializada en lugar de las tablas base de la vista incluidas en la sentencia SQL original. Este es un tema ciertamente complejo y que será objeto de un artículo completo en este blog. Como anticipo indicaré que la reescritura de sentencias SQL sólo está disponible cuando se utiliza el optimizador Oracle basado en costes.
No hay comentarios:
Publicar un comentario