El procesamiento de vistas no es optimizado:
-
No es posible crear un ínidice en una vista.
-
Los indices pueden ser usados para procesar vistas usando un algoritmo de combinación. Sin embargo, una vista que es procesada con el algoritmo de tablas temporales no es capaz de tomar ventaja de los indices en sus tablas contenidas ( aunque los indices pueden ser usados durante la generación de las tablas temporales).
Las subconsultas no pueden ser usados en la cláusula FROM
de una vista. Esta limitación sera removida en el futuro.
Existe un principio genera que no se puede modificar una tabla y una seleccion de la misma tabla en una subconsulta. Ver Sección H.3, “Restricciones en subconsultas”.
El mismo principio aplica también si usted hace una seleccion en una vista que hace una seleccion en una tabla, si la seleccion de la vista en una tabla dentro de una subconsulta la vista es evaluada usando el algoritmo de combinación(merge). Ejemplo:
CREATE VIEW v1 AS SELECT * FROM t2 WHERE EXISTS (SELECT 1 FROM t1 WHERE t1.a = t2.a); UPDATE t1, v2 SET t1.a = 1 WHERE t1.b = v2.b;
Si la vista es evaluada usando una tabla temporal, se
puede seleccionar una tabla en una subconsulta
de una vista y se puede seguir modificando la tabla que esta afuera de
la consulta. En este caso la vista sera materializada y aunque no se está
realmente seleccionando de una tabla en una subconsulta y modificandola
“a el mismo tiempo.” (Esta es otra razón que tal vez desearia
forzar a MySQL para usar el algorigo de tablas temporales especificando las
palabras
ALGORITHM = TEMPTABLE
en la definición de la vista.)
Sepuede usar DROP TABLE
o ALTER
TABLE
para eliminar o modificar una tabla que es usada en
la definición de una vista (la cual valida una vista) y ninguna alerta
resulta de la operación de elimiar o modificar. Un error ocure más tarde
cuando la vista es usada.
Una definición de una vista es “congelada” en ciertas sentencias:
-
Si una sentencia preparado por
PREPARE
refiere a una vista, el contenido de la vista es visto cada vez que la sentencia es ejecutada mas tarde sera el contenido de la vista a tiempo que fue preparada. Esto se cumple aun si la definición de la vista es cambiada después de que se preparó la sentencia y antes que ésta es ejecutada. Ejemplo:CREATE VIEW v AS SELECT 1; PREPARE s FROM 'SELECT * FROM v'; ALTER VIEW v AS SELECT 2; EXECUTE s;
El resultado regresado por la sentencia
EXECUTE
es 1, y no 2. -
Si una sentencia en una rutina almacenada refiere una vista, el contenido de la vista visto por la stentencia es su contenido de la primera ejecución de la sentencia. Por ejemplo, esto significa que si una sentencia es ejecutada en un ciclo, en futuras iteraciones de la setnencia se vera el mismo contenido de la vista, aun y si la definición de la vista cambia mas tarde en el ciclo. Ejemplo:
CREATE VIEW v AS SELECT 1; delimiter // CREATE PROCEDURE p () BEGIN DECLARE i INT DEFAULT 0; WHILE i < 5 DO SELECT * FROM v; SET i = i + 1; ALTER VIEW v AS SELECT 2; END WHILE; END; // delimiter ; CALL p();
Cuando el procedimiento p() es llamado, el SELECT regresa 1 cada vez dentro de el ciclo, aunque la definicion de la vista cambie dentro de el ciclo.
Con respecto a las actualizaciones en vistas, la meta sobre todas para las
vistas es que si cualquier vista que teoricamente se puede actualizar, esta
deberia ser una práctica de actualización. Esto incluye vistas que tienen un
UNION
en su definición. Actualmente, no todas las vistas que teoricamente
se pueden actualizar pueden ser actualizadas. La implementación inicial de vistas fue
deliberablemente escrita en esta manera en orden de obtener trabajando las vistas
actualizables en MySQL tan rapido como sea posible. Muchas actualizaciones teoricas en vistas
pueden ser actualizadas por ahora, pero algunas limitaciones siguen existiendo:
-
Las viastas actualiazbles con subconsultas en cualquier otro lugar que no sea en la clausula
WHERE
. Algunas vistas que tienen subconsultas en la listaSELECT
pueden ser actualizadas. -
No puede usar un
UPDATE
para actualizar más de una tabla incluida en una vista que sea definida como un join. -
No se puede usar una sentencia
DELETE
para actualizar una vista que está definida como un JOIN.