vistas vista una que procedimientos procedimiento funciones funcion entre ejemplos diferencia dentro crear almacenados almacenado sql sql-server stored-procedures views

que - Rendimiento del servidor SQL: ¿qué es más rápido, un procedimiento almacenado o una vista?



vistas vs funciones sql server (9)

¿Qué es más rápido en SQL Server 2005/2008, un procedimiento almacenado o una vista?

EDITAR: Como muchos de ustedes señalaron, estoy siendo demasiado vago. Déjame intentar ser un poco más específico.
Quería saber la diferencia de rendimiento para una consulta en particular en una Vista, frente a la misma consulta exacta dentro de un procedimiento almacenado. (Todavía aprecio todas las respuestas que señalan sus diferentes capacidades)


Creo que otra forma de pensar sería usar procedimientos almacenados para seleccionar las vistas. Esto hará que su arquitectura sea un sistema débilmente acoplado. Si decide cambiar el esquema en el futuro, no tendrá que preocuparse ''tanto'' por romper la parte delantera.

Creo que lo que estoy diciendo es en lugar de sp vs views, think sp y views :)


Desafortunadamente, no son del mismo tipo de bestia.

Un procedimiento almacenado es un conjunto de declaraciones T-SQL y CAN devuelve datos. Puede realizar todo tipo de lógica y no necesariamente devuelve datos en un conjunto de resultados.

Una vista es una representación de datos. Se utiliza principalmente como una abstracción de una o más tablas con combinaciones subyacentes. Siempre es un conjunto de resultados de cero, una o muchas filas.

Sospecho que su pregunta es más similar a:

¿Qué es más rápido: SELECT desde una vista, o la declaración SELECT equivalente en un procedimiento almacenado, dadas las mismas tablas base que realizan las uniones con las mismas cláusulas where?


En resumen, según mi experiencia en algunas consultas complejas, el procedimiento almacenado ofrece un mejor rendimiento que la función.

Pero no puede usar los resultados del procedimiento almacenado en seleccionar o unir consultas.

Si no desea usar el conjunto de resultados en otra consulta, mejor utilizar SP.

Y el resto de los detalles y las diferencias son mencionados por las personas en este foro y en otros lugares.


Esta no es una pregunta realmente respondible, ya que una respuesta será cierta en todos los casos. Sin embargo, como respuesta general para una implementación específica de SQL Server ...

En general, un procedimiento almacenado tiene muchas posibilidades de ser más rápido que una instrucción SQL directa porque el servidor realiza todo tipo de optimizaciones cuando un procedimiento almacenado se guarda y ejecuta la primera vez.

Una vista es esencialmente una declaración SQL guardada.

Por lo tanto, diría que, en general, es probable que un procedimiento almacenado sea más rápido que una vista SI la declaración SQL para cada uno es la misma, y ​​SI la instrucción SQL puede beneficiarse de las optimizaciones. De lo contrario, en general, serían similares en el rendimiento.

Referencia a estos enlaces la documentación que respalda mi respuesta.

http://www.sql-server-performance.com/tips/stored_procedures_p1.aspx

http://msdn.microsoft.com/en-us/library/ms998577.aspx

Además, si busca todas las formas de optimizar el rendimiento en SQL Server, el segundo enlace de arriba es un buen lugar para comenzar.


Los procedimientos almacenados (SP) y las vistas SQL son diferentes "bestias" como se indica varias veces en esta publicación.

Si excluimos algunas consideraciones de rendimiento [típicamente menores, a excepción de casos aislados] asociadas con el almacenamiento en caché del plan de consulta, el tiempo asociado con la vinculación a un Procedimiento almacenado y tal, los dos enfoques son en general equivalentes, en cuanto al rendimiento. Sin embargo...

Una vista se limita a todo lo que se pueda expresar en una sola instrucción SELECT (bueno, posiblemente con CTE y algunos otros trucos), pero en general, una vista está vinculada a formas declarativas de consultas . Un procedimiento almacenado en el otro puede usar varias construcciones de tipo procedural (así como las declarativas), y como resultado, al usar SP, uno puede crear manualmente una forma de resolver una consulta dada que puede ser más eficiente que lo que SQL-Server optimizador de consultas puede haber hecho (sobre la base de una única consulta declarativa). En estos casos, un SP puede ser mucho más rápido (pero cuidado ... el optimizador es bastante inteligente, y no hace falta mucho para hacer un SP mucho más lento que la vista equivalente.)

Además de estas consideraciones de rendimiento, los SP son más versátiles y permiten una gama más amplia de consultas y acciones que las vistas.


Los procedimientos almacenados y las vistas son diferentes y tienen diferentes propósitos. Miro las vistas como consultas enlatadas. Veo los procedimientos almacenados como módulos de código.

Por ejemplo, supongamos que tiene una tabla llamada tblEmployees con estas dos columnas (entre otras): DateOfBirth y MaleFemale .

Una vista llamada viewEmployeesMale que filtra solo a los empleados varones puede ser muy útil. Una vista llamada viewEmployeesFemale también es muy útil. Ambas vistas son autodescriptivas y muy intuitivas.

Ahora, digamos que necesita producir una lista de todos los empleados varones entre las edades de 25 y 30. Tiendo a crear un procedimiento almacenado para producir este resultado. Si bien es cierto que podría construirse como una vista, en mi opinión, un procedimiento almacenado es más adecuado para hacer frente a esto. La manipulación de la fecha, especialmente cuando los nulos son un factor, puede ser muy complicado.


Prefiero los procedimientos almacenados debido a Permitir un mayor control sobre los datos, si desea construir un sistema modular bueno y seguro, luego utilice procedimientos almacenados, puede ejecutar múltiples comandos sql, tiene instrucciones de control de flujo y acepta parámetros. Todo lo que puede hacer en una vista lo puede hacer en un procedimiento almacenado. Pero en un procedimiento almacenado, puede hacerlo con mucha más flexibilidad.


Sé que se supone que no debo convertir esto en una "discusión", pero estoy muy interesado en esto y simplemente pensé en compartir mis observaciones empíricas de una situación específica, con referencia particular a todos los comentarios anteriores que indican que una declaración SELECT equivalente ejecutada desde un Procedimiento almacenado y una Vista deberían tener, en términos generales, el mismo rendimiento.

Tengo una vista en la base de datos "A" que une 5 tablas en una base de datos separada (db "B"). Si adjunto a db "A" en SSMS y SELECCIONE * desde la vista, tardará> 3 minutos en devolver 250000 filas. Si tomo la declaración de selección de la página de diseño de la vista y la ejecuto directamente en SSMS, toma <25 segundos. Al poner la misma instrucción de selección en un procedimiento almacenado, se obtiene el mismo rendimiento cuando ejecuto ese procedimiento.

Sin hacer ninguna observación sobre el rendimiento absoluto (db "B" es una base de datos AX que no podemos tocar!), Sigo absolutamente convencido de que, en este caso, usar un SP es un orden de magnitud más rápido que usar una Vista para recuperar los mismos datos, y esto se aplica a muchas otras vistas similares en este caso particular.

No creo que tenga nada que ver con la creación de una conexión con el otro db, a menos que al usar una vista, de alguna manera nunca pueda almacenar en caché la conexión mientras que la selección sí lo haga, porque puedo cambiar entre las 2 selecciones en la misma ventana SSMS repetidamente y el rendimiento de cada consulta permanece constante. Además, si me conecto directamente a db "B" y ejecuto la selección sin el dbname.dbo .... refs, toma el mismo tiempo.

¿Alguna idea de alguien?


Un par de otras consideraciones: si bien el rendimiento entre un SP y una vista es esencialmente el mismo (dado que realizan exactamente la misma selección), el SP le da más flexibilidad para la misma consulta.

  • El SP admitirá ordenar el conjunto de resultados; es decir, que incluye una instrucción ORDER BY. No puedes hacerlo en una vista.
  • El SP está completamente compilado y solo requiere un ejecutivo para invocarlo. La vista aún requiere una vista SELECT * FROM view para invocarla; es decir, una selección en la selección compilada en la vista.