Lentitud al ejecutar procedimiento almacenado contra método .FindFirst y SELECT

06/04/2009 - 17:44 por José A. Giménez [Py] | Informe spam
Saludos a todos, estos probando mostrar datos en un formulario de access
2007, lo hago mediante un procedimiento almacenado en SQl Server Exress
2008, al que le envio un parámetro y me devuelve los datos que necesito. Son
pocos campos, con informacion toda de tipo texto.
Llamo al procedimiento por código almacenado usando ADO.
He leido que siempre es mejo utilizar procedimientos almacenados para
realizar las grabaciones y modificaciones en los registros de una base en
SQl Server Express 2008 para ganar efeiciencia.
He probado con varios código apra ver cual es más rápido, incluso u código
que no ejecuta procedimiento almacenado y lo hace haciendo directamente un
SELECT sobre la tabla.
El código que más rápido trae los datos no es el del procedimeinto
almacenado, sino en el que uso el método .FindFisrt para localizar el
registro y mostrar sus datos.
Tenía entendido que el procedimeinto almacenado sería más rápido, la
difencia entre el código con .FindFirst y el procedimiento almacenado es muy
gtande, casi 1 segundo.
No debería ser la llamada al procedimiento almacenado más rápida?
Gracias

Preguntas similare

Leer las respuestas

#6 Carlos Sacristan
07/04/2009 - 09:00 | Informe spam
No puedes estar sufriendo parameter sniffing si la tabla sólo tiene un
registro, a menos que yo te esté entendiendo mal.

¿Has probado dónde está el retardo cuando usas el procedimiento almacenado?
Tal vez lo que te tarde sea abrir la conexión y no la propia ejecución del
procedimiento.

Por otro lado, no creo que haya mucha diferencia, pero en vez de tantos
parámetros de salida, ¿por qué no lo devuelves como un resulset normal?

Y ya por último, ¿esa tabla tiene un índice sobre el campo NomBanco?


Un saludo
-
www.navento.com
Servicios de Localización GPS


"José A. Giménez [Py]" wrote:

Gracias por la respuesta. El metodo findFirst se usa cuando se tienen tablas
vinculadas y se busca mediante un recorset. El problema mio según estoy
viendo es lo que se llama parameter sniffing. Cuando ejecuto consultas sobre
la tabla vinculada a SQl Server el proceso es rápido, pero cuando desvinculo
la tabla y llamo mediante una instruccion SQL o bien mediante un
procedimiento almecenado, el proceso tardar más de un segundo para traer un
registro de una tabla que solo tiene cargado 1 registro, con pocos datos.
Mi procedimiento almacenado recibe un paramatro desde Access 2007 y devuelve
los resultados del select con otro parámetros.

Cómo hacen ustedes para evitar el parameter sniffing?




Respuesta Responder a este mensaje
#7 José A. Giménez [Py]
07/04/2009 - 14:38 | Informe spam
Gracias Carlos, si, el campo está indexado.
La tabla tiene 1 registro... estoy probando, dando mis primeros pasos, me
orientas como hacer lo que me comentas en lugar de tantos parámetros de
salida??
Resulta que llamo al procedimiento almacenado desde código en Access 2007 y
no se como traer los resultados de la ejecución del procedimiento almacenado
a no ser con todos esos parámetros.
Respuesta Responder a este mensaje
#8 Carlos Sacristan
07/04/2009 - 15:04 | Informe spam
Lo que comento es que pruebes que el procedimiento devuelva la select
directamente, sin usar los parámetros de salida por medio, es decir,

SELECT Bancos.NomBanco,
Bancos.Direccion,
Bancos.Telefbanc,
Bancos.Contacto1,
Bancos.TelContac1,
Bancos.Contacto2,
Bancos.TelContac2 ,
Bancos.Notas ,
Bancos.Ciudad
FROM Bancos
WHERE Bancos.NomBanco= @NombreBanco

No sé si desde Access se puede mapear directamente el resultado de un
procedimiento almacenado a los campos, pero siempre podrías hacerlo tú por
código


Un saludo
-
www.navento.com
Servicios de Localización GPS


"José A. Giménez [Py]" wrote:

Gracias Carlos, si, el campo está indexado.
La tabla tiene 1 registro... estoy probando, dando mis primeros pasos, me
orientas como hacer lo que me comentas en lugar de tantos parámetros de
salida??
Resulta que llamo al procedimiento almacenado desde código en Access 2007 y
no se como traer los resultados de la ejecución del procedimiento almacenado
a no ser con todos esos parámetros.


Respuesta Responder a este mensaje
#9 Carlos Sacristan
07/04/2009 - 15:13 | Informe spam
No te desesperes, un cambio así no es trivial, necesitas adquirir
conocimientos y eso no se hace de un día para otro.

El usar SQL Server no implica necesariamente que tu aplicación vaya mejor.
Depende de cómo hayas hecho esa migración, puede que el diseño de esa base de
datos no sea el mejor, con lo que el rendimiento no es el esperado. Ahora hay
muchos más componentes a tener en cuenta (red, configuración del servidor,
diseño de la base de datos, etc) que antes no existían.

El ver por qué tarda más ese procedimiento comparado con el método que
comentas es difícil de responder aquí porque nos faltan datos. Habría que ver
si realmente es la ejecución del procedimiento lo que tarda o (apostaría por
ello) todo el proceso de abrir conexión, llamar al procedimiento y pintar los
resultados en tu formulario.

Tal vez antes de dar ese cambio deberías formarte un poco más. Algún buen
libro de SQL Server (si sabes inglés, los de la serie "Inside SQL Server" son
los mejores) o un curso introductorio te valdría para empezar a sacarle
partido.


Un saludo
-
www.navento.com
Servicios de Localización GPS


"José A. Giménez [Py]" wrote:

Pregunto, cómo hacen ustedes para trabajar con el SQL Server y no tener
estos problemas?
Tienen aplicaciones que llaman al SQL? o cómo lo hacen?
La verdad es que es tremendamente frustrante notar que lo que debería se más
eficiente resulta todo lo contrario,
me estoy preguntando si en en realidad vale la pena cambiar a SQL Server mi
aplicación y mantenerla con Access, ya que si la llamada a una tabla que
tiene un registro tarda tanto, no me imagino cuando tenga 1000 registros...
He preguntado sobre cómo sería más eficiente, me recomendaron no vincular
las tablas desde Access, ya que con el tiempo esto se vuelve muy lento (me
consta), probé usando código directamente enviando una cadena SQL para
obtener resultados de la base de datos , probé usando el método
.findFirst... entonces me encontré con la idea de que usando un
procedimiento almacenado "volaría" en fin, por favor, sáquenme de este
mar de ignorancia, porque no se ya que hacer para esto funcione... cómo lo
hacen ustedes???

Gracias!

Respuesta Responder a este mensaje
#10 Alejandro Mesa
07/04/2009 - 16:20 | Informe spam
José A. Giménez [Py],

Tengo dos recomendaciones para tratar de mejorar el tiempo de respuesta de
tu aplicacion.

1 - Adiciona la sgte linea a tu stored procedure, como primera linea despues
de "AS".

SET NOCOUNT ON;

Esto evitara que el mensaje sobre filas afectadas sea devuelto hacia la
aplicacion cliente y por tanto sera algo menos que procesar. No recuerdo
bien, pero creo que los parametros de salida, junto con el valors de retorno,
van en el ultimo paquete enviado hacia la aplicacion cliente. Si no tenemos
nada que enviar antes de estos, entonces sera mas rapido.

2 - Crees que puedas postear la estructura de la tabla, including
restricciones e indices.

Por lo que puedo apreciar, usas el nombre del banco para identificar
unicamente cada file en la tabla, correcto?

Me pregunto si esta columna es la clave primaria de la tabla, porque de ser
asi, te recomendaria usar una columna que ocupe menos espacio, como integer,
algo asi como "BancoID INT NOT NULL".


AMB


"José A. Giménez [Py]" wrote:

Pregunto, cómo hacen ustedes para trabajar con el SQL Server y no tener
estos problemas?
Tienen aplicaciones que llaman al SQL? o cómo lo hacen?
La verdad es que es tremendamente frustrante notar que lo que debería se más
eficiente resulta todo lo contrario,
me estoy preguntando si en en realidad vale la pena cambiar a SQL Server mi
aplicación y mantenerla con Access, ya que si la llamada a una tabla que
tiene un registro tarda tanto, no me imagino cuando tenga 1000 registros...
He preguntado sobre cómo sería más eficiente, me recomendaron no vincular
las tablas desde Access, ya que con el tiempo esto se vuelve muy lento (me
consta), probé usando código directamente enviando una cadena SQL para
obtener resultados de la base de datos , probé usando el método
.findFirst... entonces me encontré con la idea de que usando un
procedimiento almacenado "volaría" en fin, por favor, sáquenme de este
mar de ignorancia, porque no se ya que hacer para esto funcione... cómo lo
hacen ustedes???

Gracias!

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida