2011-01-07 23 views
8

Escenario:¿La consulta sobre una vista es más lenta que la ejecución de SQL directamente?

Tengo que unir 3 tablas, una cláusula where para limitar el conjunto de resultados, y solo unas pocas columnas de cada tabla que se selecciona. Sencillo. Sin embargo, la consulta para hacer esto no es muy bonita, y cuando se utiliza un ORM entre la base de datos y la aplicación, es como tratar de poner una clavija cuadrada en un agujero redondo.

Mi forma de evitar esto es crear una vista que abarque la consulta y ahora mi modelo de aplicación se asigna directamente a una vista en la base de datos; no más mapas locos de la capa ORM.

Pregunta: Suponiendo que no entren en juego otros factores, ¿La consulta contra la vista incurrirá en penalizaciones de rendimiento adicionales que no habría alcanzado si ejecutara la instrucción SQL directamente? - Esta no es una vista indexada, asume la misma cláusula where, mantén esto simple.

Me están haciendo creer que una vista sufre de gastos adicionales de "construcción". Mi entendimiento es que con todo lo demás igual, los dos deberían tener un rendimiento idéntico.

Por favor, aclare. ¡Gracias!

+1

Depende de su base de datos, y muchas otras cosas. Si es MySQL, la respuesta es Sí, es más lento. – nos

Respuesta

4

De MSDN: View resolution

Cuando una instrucción SQL referencia a una vista no indizada, el analizador y optimizador de consultas de analizar la fuente tanto de la instrucción SQL y la vista y luego se resuelve en un único plan de ejecución. No hay un plan para la declaración SQL y un plan separado para la vista.

No debería haber ningún rendimiento diferente. Views lo ayuda a organizar, no a mejorar el rendimiento. A menos que esté usando vistas indexadas.

Solo se almacena la definición de una vista no indexada, no las filas de la vista. El optimizador de consultas incorpora la lógica de la definición de vista en el plan de ejecución que construye para la declaración SQL que hace referencia a la vista no indexada.

+0

Siempre que la vista se haya ejecutado antes no debería haber diferencia. De hecho, la vista puede ser un poco más rápida porque puede tener un plan de consulta en caché. – Matthew

3

En Oracle, el rendimiento es el mismo. Una vista es realmente una declaración sql con nombre. Pero más elegante.

Cuando comienza a anidar vistas y unir vistas con otra tabla o vistas, las cosas se complican muy rápido. Si Oracle no puede llevar sus filtros a la vista de la tabla, a menudo tiene que materializarse (crear una tabla temporal de) partes de la consulta, y aquí es cuando obtiene el mal rendimiento.

Cuestiones relacionadas