2009-03-25 29 views
27

Desde que MySQL comenzó a admitir procedimientos almacenados, nunca los he usado realmente. En parte porque no soy un gran escritor de consultas, en parte porque a menudo trabajo con los DBA que hacen esas elecciones por mí, en parte porque estoy cómodo con Lo que sé.MySQL: Vistas vs Procedimientos almacenados

En términos de selección de datos, específicamente cuando se considera una selección que es esencialmente una des-normalización (uniones) y agregado (promedio o máximo, subconsultas con recuentos, etc.) selección de datos, ¿cuál es la elección correcta en MySQL 5.x? ¿Una vista? O un procedimiento almacenado?

Vistas Me siento cómodo con - usted sabe cómo se supone que debe verse su consulta SELECT, así que solo cree eso, asegúrese de que sea indexado y lo que sea, simplemente haga un CREATE VIEW [View] AS SELECT [...]. Luego, en mi aplicación, trato la vista como una tabla de solo lectura, representa una versión desnormalizada de mis datos normalizados.

¿Cuáles son las desventajas aquí, si las hay? ¿Y qué cambiaría (ganancias o pérdidas) si moviera esa misma instrucción SELECT exacta a un procedimiento almacenado?

Espero encontrar una buena información "oculta" que ha sido difícil de encontrar al buscar en Google este tema, pero realmente doy la bienvenida a todos los comentarios y respuestas.

+2

Para cualquier otra persona que encuentre esta publicación y no sienta que estas respuestas se ajustan perfectamente a sus necesidades, hay algunos comentarios excelentes sobre [MSDN Social] (http://social.msdn.microsoft.com/Forums/es-ES/sqlgetstarted/thread/64e834bc-c473-41dc-bb3c-6fd3bcfa0d57) que realmente ayudan a construir una comprensión más sólida de los fundamentos. – Chiramisu

Respuesta

12

En mi opinión, los procedimientos almacenados deben utilizarse únicamente para la manipulación de datos cuando la misma rutina debe utilizarse entre varias aplicaciones diferentes o para ETL entre bases de datos o tablas, nada más. Básicamente, haga tanto código como pueda hasta que se encuentre con el principio DRY o lo que está haciendo es simplemente mover datos de un lugar a otro dentro del DB.

Las vistas se pueden usar para proporcionar una "vista" alternativa o simplificada en los datos. Como tal, iría con una vista ya que no estás realmente manipulando los datos tanto como encontrar un método diferente para mostrarlos.

+0

Eso está muy bien hasta que se encuentra con un conjunto de datos con> 100k registros y necesita usar 'COUNT (*)' en su subconjunto. Los procedimientos almacenados funcionan igual de bien para la recopilación de datos, que a veces es necesario. –

3

No estoy seguro si se trata de una opción cualquiera. Los procedimientos almacenados pueden hacer una amplia variedad de cosas que las vistas tendrían dificultades (piense en poblar datos en tablas temporales, luego ejecutar el cursor sobre ellos y luego hacer la agregación y devolver un conjunto de resultados).

Las vistas, por otro lado, pueden ocultar derechos de acceso/sql complejos y presentar una vista modificada del esquema.

Creo que ambos tienen un lugar en el esquema de cosas y ambos son útiles para una implementación exitosa del esquema.

4

Uso las vistas para la normalización o el formato de salida y los procedimientos almacenados para el filtrado y la manipulación de datos (cosas que requieren entradas de parámetros) o la iteración (cursores).

A menudo accedo a una vista dentro de un procedimiento almacenado cuando se requiere tanto la des-normalización como el filtrado.

2

Una cosa a tener en cuenta, al menos con los resultados de la vista mysql se almacenan en una tabla temporal y a diferencia de la mayoría de los motores de base de datos decentes esta tabla no está indexada, por lo que si se utiliza para simplificar las consultas, capte todos los resultados de la vista; sin embargo, si busca los resultados de esa vista, según los parámetros, es increíblemente lenta, especialmente si hay millones de registros que examinar y, lo que es peor, si la vista se construye sobre otras vistas y así.

Un procedimiento almacenado, sin embargo, puede pasar esos parámetros de búsqueda y ejecutar la consulta directamente en las tablas subrayadas (indexadas). La desventaja es que los resultados deberán buscarse cada vez que se ejecute el procedimiento, lo que también puede ocurrir con una vista de todos modos, dependiendo de la configuración del servidor.

así que, básicamente, si utiliza una vista intente minimizar el número de resultados (si luego necesita buscarlo) de lo contrario, utilice un procedimiento almacenado.

Cuestiones relacionadas