¿Que es mejor/mas rapido/ mas eficiente: SP's o UDF's?

30/11/2004 - 00:44 por Battle Troll | Informe spam
Hola a todos.

Ahora que la tormenta ha pasado...
tengo una duda de rendimiento, no se si me pudieran ayudar.

Estoy sacando desde Access (usandolo como front end) datos que estan en un
servidor MS SQl s. en la empresa donde trabajo. Estaba viendo que tengo de
2 sopas basicas para obtener mis resultados: un procedimiento que tome
parametros y haga la consulta con base en ellos, o una funcion que regrese
una tabla.

Vi que desde Access podia directamente hacer una subconsulta con los datos
que me regresa una funcion que regresa un objeto tabla, haciendo algo como:
SELECT * FROM MiUDF(Par1, Par2) WHERE Campo1='algo'

Empero, no puedo hacer tal cosa directamente si obtengo los datos mediante
un procedimiento almacenado... tengo que hacer primero una consulta de
paso a traves con:
exec MiSP( Par1, Par2)

y guardarla como, digamos, "MiConsulta", y despues hacer otra consulta
donde si puedo hacer:
SELECT * FROM MiConsulta WHERE Campo1='algo'

Y veo que hay una 3a opcion, usar un SP con un parametro "de salida"... es
solo que no me acaba de convencer esa opcion... siento que a largo plazo
un programador que llegue despues podria no parecerle tan obvio que es de
salida y querer usarlo como entrada, y ademas no me acaban de gustar... me
recuerdan demasiado los parametros "por referencia" de c++ y basic, que
tantos problemas me han dado...

Tentado me siento a manejar sencillamente todo mediante UDF's que regresen
tablas, pero despues lo pense mejor respecto al rendimiento...
no se si alguien sepa o me pudiera decir las ventajas o desventajas de
cada enfoque: cual es mas rapida, cual usa menos recursos de la maquina,
cual es mas conveniente a largo plazo.

Estaba leyendo que muchas veces SQL Server tiende a manejar las UDF's cual
si procs. almacenados con cursores se tratase, ¿es cierto? Hasta ahora yo
no he notado ninguna penalizacion en velocidad, pero no se a largo plazo...

Bueno, era mi duda, no se si alguien pueda (quiera) ayudarme.
Gracias por todo.
Battle Troll
La mayoria de las preguntas que se nos pudieran ocurrir ya fueron
preguntadas y contestadas anteriormente.
Puedes buscar en los archivos de Usenet a través de Google:
http://groups-beta.google.com/group....es.access
 

Leer las respuestas

#1 MAXI
30/11/2004 - 01:53 | Informe spam
Hola, los sp tienen otro tratamiento. Que sucede, el sp no va a volver a
compilar el plan de ejecucion a menos que se lo indiques y ademas permancera
en la RAM.

Ahora bien, las UDF tinen funcionalidad distinta a los Sp y son muy utiles
de verdad.

Si hablamos de rendimiento puro los SP siempre son la mejor opcion pero esto
se nota en volumenes grandes generalmente. Las udf son una alternativa a la
solucion de algunos problemas.

Las ventajas a mi juicio de las UDF es que las podes utilizar dentro de tus
instrucciones SELECT por ej, pero los SP debes ejecutarlos. Por ej si queres
hacer la funcionalidad de las vistas parametrizadas, me parece que las Udf
son mucho mas propocias. Yo debo reconocer que uso pocas udf, casi ninguna,
pero va en cuestion de gustos y necesidades :)




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar

Msn Messenger:

"Battle Troll" escribió en el mensaje
news:
Hola a todos.

Ahora que la tormenta ha pasado...
tengo una duda de rendimiento, no se si me pudieran ayudar.

Estoy sacando desde Access (usandolo como front end) datos que estan en un
servidor MS SQl s. en la empresa donde trabajo. Estaba viendo que tengo de
2 sopas basicas para obtener mis resultados: un procedimiento que tome
parametros y haga la consulta con base en ellos, o una funcion que regrese
una tabla.

Vi que desde Access podia directamente hacer una subconsulta con los datos
que me regresa una funcion que regresa un objeto tabla, haciendo algo
como:
SELECT * FROM MiUDF(Par1, Par2) WHERE Campo1='algo'

Empero, no puedo hacer tal cosa directamente si obtengo los datos mediante
un procedimiento almacenado... tengo que hacer primero una consulta de
paso a traves con:
exec MiSP( Par1, Par2)

y guardarla como, digamos, "MiConsulta", y despues hacer otra consulta
donde si puedo hacer:
SELECT * FROM MiConsulta WHERE Campo1='algo'

Y veo que hay una 3a opcion, usar un SP con un parametro "de salida"... es
solo que no me acaba de convencer esa opcion... siento que a largo plazo
un programador que llegue despues podria no parecerle tan obvio que es de
salida y querer usarlo como entrada, y ademas no me acaban de gustar... me
recuerdan demasiado los parametros "por referencia" de c++ y basic, que
tantos problemas me han dado...

Tentado me siento a manejar sencillamente todo mediante UDF's que regresen
tablas, pero despues lo pense mejor respecto al rendimiento...
no se si alguien sepa o me pudiera decir las ventajas o desventajas de
cada enfoque: cual es mas rapida, cual usa menos recursos de la maquina,
cual es mas conveniente a largo plazo.

Estaba leyendo que muchas veces SQL Server tiende a manejar las UDF's cual
si procs. almacenados con cursores se tratase, ¿es cierto? Hasta ahora yo
no he notado ninguna penalizacion en velocidad, pero no se a largo
plazo...

Bueno, era mi duda, no se si alguien pueda (quiera) ayudarme.
Gracias por todo.
Battle Troll
La mayoria de las preguntas que se nos pudieran ocurrir ya fueron
preguntadas y contestadas anteriormente.
Puedes buscar en los archivos de Usenet a través de Google:
http://groups-beta.google.com/group....es.access

Preguntas similares