Pregunta

Cuando se crea una vista básicamente estoy haciendo una nueva tabla que automáticamente se tramita en cuando los datos en una de las mesas que se une a los cambios; ¿es correcto?

También por qué no puedo utilizar subconsultas en mi opinión?

¿Fue útil?

Solución

Vista trabaja un como una mesa , pero no es una mesa. Nunca existe; es sólo una sentencia SQL preparada que se ejecuta cuando se hace referencia al nombre de la vista. IE:

CREATE VIEW foo AS
  SELECT * FROM bar

SELECT * FROM foo

... es equivalente a ejecutar:

SELECT x.* 
  FROM (SELECT * FROM bar) x

A mysqldump no contendrá filas para ser insertado en una vista ...

También por qué no puedo utilizar subconsultas en mi opinión ????

Esto, lamentablemente, es por (aunque sea cuestionable) de diseño. Hay numerosas limitaciones para las vistas de MySQL, las cuales están documentadas: http: // dev.mysql.com/doc/refman/5.0/en/create-view.html

Así que si es sólo una declaración mesa imaginaria / preparado ¿Eso significa que teóricamente tiene el mismo rendimiento (o incluso menos) como una mesa normal / consulta?


No.
Una tabla puede tener índices asociados, que pueden hacer la recuperación de datos más rápida (con algún costo para insertar / actualizar). Algunas bases de datos de soporte "materializadas" puntos de vista, que son puntos de vista que pueden tener índices aplicados a ellos - que no debería ser una sorpresa que MySQL no admite dada la funcionalidad de visión limitada (que sólo se inició en v5 IIRC, muy tarde en el juego).

Debido a una vista es una tabla derivada, el rendimiento de la vista es sólo tan buena como la consulta que se construye. Si esa consulta chupa, el problema de rendimiento simplemente bola de nieve ... Dicho esto, al consultar una vista - si una referencia de columna vista en la cláusula WHERE no se envuelve en una función (IE: WHERE v.column LIKE ..., no WHERE LOWER(t.column) LIKE ...), el optimizador puede empujar a los criterios (llamado un predicado) en la consulta original - lo que es más rápido

.

Otros consejos

me encontré con el mismo problema también (para mi sorpresa, debido a mi búsqueda parece indicar que Oracle y MS no lo soportan).

Me superar esta limitación (al menos por ahora, hasta que se demuestre no utilizable) mediante la creación de dos vistas adicionales para mi opinión final.

Ejemplo:

CREATE VIEW Foo1 AS
    SELECT * FROM t ORDER BY ID, InsertDate DESC

CREATE VIEW Foo2 AS
    SELECT * FROM Foo1 GROUP BY ID

CREATE VIEW Foo AS
    SELECT * FROM Foo2 ORDER BY ID

El ejemplo anterior tiene, básicamente, una mesa 't' que es una tabla temporal que contiene todas las revisiones. Mi 'Foo' (ver) básicamente es un simple punto de vista de la mayoría de mis sólo la versión actual de cada registro. Parece bien el trabajo por ahora!

Actualización:

No sé si esto es otro error en MySQL 5.1, pero el ejemplo anterior no en el trabajo hecho! La obra 'foo1' como se esperaba, pero el 'Foo2' parece ignorar la orden antes de la agrupación así que mi resultado final no es lo que se pretende. Incluso consigo el mismo resultado si cambio de la 'DESC' para 'ASC' (sorprendentemente).

Además, si usted lee el 17.5.1. Ver Sintaxis , se dice claramente:

"Una vista puede crearse a partir de varios tipos de sentencias SELECT. Se puede hacer referencia a tablas de base o de otros puntos de vista. Se pueden usar combinaciones, unión y subconsultas."

Me voy a actualizar mi base de datos a 5,6 e intentarlo de nuevo!

La diferencia es la siguiente:

de vista que sólo puede tener subconsultas en el donde - parte, no en el de - por lo que una parte

CREATE VIEW v AS SELECT * FROM foo WHERE id IN (SELECT id FROM bar) 

funcionaría - pero al mismo tiempo se obtiene una vista de sólo lectura ... A simple vista en una sola tabla permitiría a la actualización "a través de" la vista de la tabla subyacente

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top