SQL-Server Rendimiento:Lo que es más rápido, un procedimiento almacenado o un punto de vista?

StackOverflow https://stackoverflow.com/questions/1603853

Pregunta

Lo que es más rápido en SQL Server 2005/2008, un Procedimiento Almacenado o un punto de Vista?

EDITAR: Como muchos de ustedes señaló, estoy siendo demasiado vaga.Permítanme intentar ser un poco más específico.
Yo quería saber la diferencia de rendimiento para una consulta en particular en una Vista, frente a la exacta misma consulta dentro de un procedimiento almacenado.(Yo todavía apreciar todas las respuestas que señalan sus capacidades diferentes)

¿Fue útil?

Solución

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

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

Una vista está limitada a lo que pueda expresarse 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 de procedimiento (así como las declarativas), y como resultado, usando SPs, uno puede crear a mano una forma de resolver una consulta dada que puede ser más eficiente que lo que pudo haber hecho el optimizador de consultas de SQL Server (en base a una única consulta declarativa). En estos casos, un SP puede ser mucho más rápido (pero tenga cuidado ... el optimizador es bastante inteligente, y no hace falta mucho para que un SP sea 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.

Otros consejos

Desafortunadamente, no son el mismo tipo de bestia.

Un procedimiento almacenado es un conjunto de sentencias T-SQL y PUEDE devolver 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 usa principalmente como una abstracción de una o más tablas con combinaciones subyacentes. Siempre es un conjunto de resultados de cero, una o varias filas.

Sospecho que su pregunta está más en la línea de:

  

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

Esto no es realmente un responsable de la pregunta en la que una respuesta se repite en todos los casos.Sin embargo, como una respuesta general para una específica de SQL Server establecimiento...

En general, un Procedimiento Almacenado tiene buenas posibilidades de ser más rápido que un directo de la instrucción SQL ya que el servidor realiza todo tipo de optimizaciones cuando un procedimiento almacenado se guarda y ejecuta el primer tiempo.

Una vista es esencialmente una instrucción SQL guardada.

Por lo tanto, yo diría que, en general, un procedimiento almacenado es probable que sea más rápido que una vista SI la instrucción SQL para cada uno es el mismo, y SI la declaración SQL se pueden beneficiar de las optimizaciones.De lo contrario, en general, que sería similar en el rendimiento.

Referencia de estos enlaces documentación de apoyo de mi respuesta.

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

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

También, si usted está buscando todas las maneras de optimizar el rendimiento de SQL Server, el segundo enlace de arriba es un buen lugar para empezar.

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

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

Pero no puede utilizar los resultados del procedimiento almacenado en consultas de selección o unión.

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

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

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

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

Una vista llamada viewEmployeesMale que filtra sólo los empleados de sexo masculino puede ser muy útil.Una vista llamada viewEmployeesFemale también es muy útil.Estos dos puntos de vista son auto describir y muy intuitiva.

Ahora, supongamos que usted necesita para producir una lista de todos los empleados de sexo masculino entre las edades de 25 y 30 años.Yo tendería a crear un procedimiento almacenado para producir este resultado.Mientras que la mayoría sin duda podría ser construido como una vista, en mi opinión un procedimiento almacenado es más adecuado para tratar con esto.Fecha de manipulación especialmente donde los valores nulos son un factor que puede llegar a ser muy complicado.

Creo que otra forma de pensar sería utilizar 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' que rompa el frente.

Supongo que lo que digo es en lugar de sp vs views, piensa sp y views :)

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 brinda más flexibilidad para esa misma consulta.

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

Sé que se supone que no debo convertir esto en una & "; discusión &"; pero estoy muy interesado en esto y solo pensé en compartir mis observaciones empíricas de una situación específica, con referencia particular a todos los comentarios anteriores que establecen que una instrucción SELECT equivalente ejecutada desde un Procedimiento almacenado y una Vista debería tener en general 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 & Quot; A & Quot; en SSMS y SELECT * desde la vista, se tarda > 3 minutos para devolver 250000 filas. Si tomo la instrucción select de la página de diseño de la vista y la ejecuto directamente en SSMS, toma & Lt; 25 segundos Poner la misma instrucción select en un procedimiento almacenado proporciona 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 se nos permite tocar!), todavía estoy absolutamente convencido de que en este caso utilizando 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 tiene nada que ver con la creación de una conexión a la otra base de datos, a menos que al usar una vista de alguna manera nunca pueda almacenar en caché la conexión, mientras que la selección sí, porque puedo cambiar entre el 2 selecciona repetidamente en la misma ventana de SSMS y el rendimiento de cada consulta permanece constante. Además, si me conecto directamente a db & Quot; B & Quot; y ejecute select sin dbname.dbo .... refs, lleva el mismo tiempo.

¿Alguna idea de alguien?

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