2009-06-12 19 views

Respuesta

-1

Una función realiza una tarea o muchas tareas. Una vista recupera datos a través de una consulta. Lo que siempre cabe en esa consulta es lo que también está limitado. En una función, puedo actualizar, seleccionar, crear variables de tabla, eliminar algunos datos, enviar un correo electrónico, interactuar con un CLR que creo, etc. ¡De una manera mucho más poderosa que una simple vista!

+1

Pero siempre debe preferir una vista sobre una función donde sea posible, para un máximo rendimiento y portabilidad. – RedFilter

0

Una vista es una "vista" de datos que se devuelve de una consulta, casi una pseudo-tabla. Una función devuelve un valor/tabla generalmente derivado de consultar los datos. Puede ejecutar cualquier instrucción sql en una función siempre que la función finalmente devuelva un valor/tabla.

0

Una función le permite pasar parámetros para crear una vista más específica. Digamos que querías tener clientes atrapados según el estado. Una función le permitiría pasar el estado que está buscando y otorgarle a todos los clientes ese estado. Una vista no puede hacer eso.

+0

Pero una vista puede exponer ese estado, y luego puede filtrar utilizando una cláusula where. – RedFilter

+0

Eso es verdad. Pero una función se ve mejor para un programador que lee el código. Seleccione * FROM CustomersByState ('Iowa') es más fácil de leer que SELECT * FROM vCustomers WHERE State = 'Iowa'. Aunque esa es sólo mi opinión. –

2

Actualización: Parece que me perdí la parte "en línea". Sin embargo, dejo la respuesta aquí en caso de que alguien quiera leer sobre la diferencia entre las VIEW y las funciones normales.

Si solo tiene una función que SELECCIONE y envíe los datos, entonces son similares. Sin embargo, incluso entonces, no son lo mismo porque VIEWs puede ser optimizado por el motor. Por ejemplo, si ejecuta SELECT * FROM view1 WHERE x = 10; y tiene un índice en el campo de tabla que se asigna a X, entonces se usará. Por otro lado, la función genera un conjunto de resultados antes de la búsqueda, por lo que tendría que mover DONDE está dentro de ella; sin embargo, esto no es fácil porque puede tener muchas columnas y no puede ORDENAR por todas las personas en la misma instrucción de selección.

Por lo tanto, si compara vistas y funciones para la misma tarea de dar una "vista" sobre los datos, entonces las VIEW son una mejor opción.

PERO, las funciones pueden hacer mucho más. Puede hacer varias consultas sin necesidad de unir tablas con UNIONES o UNIONES. Puede hacer algunos cálculos complejos con los resultados, ejecutar consultas adicionales y datos de salida para el usuario. Las funciones son más como procedimientos almacenados que pueden devolver conjuntos de datos, luego son como vistas.

1

Una gran diferencia es que una función puede tomar parámetros mientras que una VISTA no.

Tiendo a favorecer VIEW, siendo una implementación estándar y por lo tanto portátil. Utilizo funciones cuando la vista equivalente no tiene sentido sin una cláusula WHERE.

Por ejemplo, tengo una función que consulta una tabla de estado de tiempo de validez relativamente grande (tabla 'historial'). Si se tratara de una VISTA e intentara consultarla sin una cláusula WHERE, obtendría una gran cantidad de información imparcial (¡al final!) El uso de una función establece un contrato que, si desea los datos, debe proporcionar una ID de cliente, una fecha de inicio y una fecha de finalización y la función es cómo establezco este contacto. ¿Por qué no un proceso almacenado? Bueno, espero que un usuario desee UNIRSE al conjunto de resultados para obtener más datos (tablas, VISUALIZACIONES, funciones, etc.) y una función es IMO la mejor manera de hacerlo en lugar de, por ejemplo, requerir que el usuario escriba el conjunto de resultados en un mesa.

3

No hay diferencia. Ambos se expanden/anulan en la consulta que contiene.

Nota: las vistas indizadas se consideran de manera diferente pero aún se pueden expandir, y las funciones de tabla de valores múltiples son recuadros negros para la consulta que lo contiene.

Tony Rogerson: VIEWS - they offer no optimisation benefits; they are simply inline macros - use sparingly

Adam Machanic: Scalar functions, inlining, and performance: An entertaining title for a boring post

Related SO question: Does query plan optimizer works well with joined/filtered table-valued functions?

Por último, escribe a las tablas no están permitidos en funciones

Editar, después de comentar y downvote de Eric Barba Z ...

Las preguntas y respuestas (no solo las mías) no se tratan de udfs escalares. "En línea" significa "funciones valoradas en la tabla en línea". Conceptos muy diferentes ...

+0

Eso no es correcto para las funciones, no para el servidor Sql. Las funciones son un recuadro negro y no se expanden en la consulta que lo contiene; por eso el rendimiento es horrible si usa funciones que consultan cualquier cosa. Se convierte en un bucle anidado malo ya que la función se maneja por separado para cada fila. –

+0

@Eric: para una función de tabla en línea, lo que dije es correcto. Dije que los TVF de múltiples valores son cajas negras. La pregunta y mi respuesta no se refieren a "escalares udfs" que tienen recuadros negros. – gbn

+0

Sí, me perdí "en línea", tienes razón. –

15

Después de leer muchas de las respuestas aquí, me gustaría señalar que hay una gran diferencia entre una función en línea con valores de tabla y cualquier otro tipo de función (TVF escalar o multilínea)

Un TVF en línea es simplemente una vista parametrizada. Se puede expandir y optimizar como una vista. No es necesario materializar nada antes de "devolver resultados" o algo por el estilo (aunque, desafortunadamente, la sintaxis tiene un RETURN.

Una gran ventaja que he encontrado de un TVF en línea sobre una vista es que no fuerza Parametrización requerida mientras que con una vista, debe asumir que la persona que llama se unirá apropiadamente o restringirá el uso de la vista.

Por ejemplo, tenemos muchas tablas de hechos grandes en DW con un modelo estrella típico de Kimball. Ver en un modelo centrado en tablas de hechos, que llamó sin ninguna restricción, devolverá cientos de millones de filas. Al usar un TVF en línea con la parametrización adecuada, los usuarios no pueden pedir accidentalmente todas las filas. El rendimiento es en gran parte indistinguible entre los dos.

1

Respondiendo a su pregunta acerca de las actualizaciones en una función (msdn):

Los únicos cambios que se pueden hacer por las declaraciones en la función son cambios en los objetos locales a la función , tales como locales cursores o variables . Las modificaciones a la base de datos tablas, las operaciones en los cursores que se no es local a la función, el envío de correo electrónico, que intentan una modificación catálogo , y que generan un resultado conjunto que se devuelve al usuario son ejemplos de acciones que no pueden ser realizado en una función.

2

Nadie parece haber mencionado este aspecto.

No se puede tener Update declaraciones en una función en línea, pero puede escribir Update declaraciones contra ellos como si fueran una vista actualizable.

Cuestiones relacionadas