Conexiones SQL optima

16/09/2004 - 18:16 por Jimy Campos | Informe spam
Hola como estan amigos, espero me puedan quitar una duda.

Tengo una aplicación que recibe transacciones que deben
ser insertadas en una tabla de una bd en el sql server,
ahora esta aplicación desarrollada por un tercero crea
50 conexiones permanentes hacia el servidor argumentando
que asi es más rapida.

Bueno en mi simple Opinión pienso que no es necesario
mantener 50 conexiones si no 1 para enviar los insert.

Ahora puede darse el caso que lleguen 20 transacciones a
la vez para que sean insertados en la tabla, es más rapido
tener las 50 conexiones diferentes ó solo 1 para estas 20.


esa es mi duda y si alguien puede explicar por que les
agradeceria.

Gracias
Jimy

Preguntas similare

Leer las respuestas

#1 Gustavo Larriera [MVP]
16/09/2004 - 18:46 | Informe spam
Como norma general hay que considerar que la creación/destrucción de
conexiones suele ser un proceso que demora en cualquier aplicación cliente
de SQL Server. Lo normal es usar mecanismos de pooling de conexiones que
definen un conjunto de N conexiones que son reusadas para minimizar la
cantidad de creaciones de conexiones.

Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and confers
no rights.
"Jimy Campos" wrote in message
news:16fd01c49c08$9212bef0$
Hola como estan amigos, espero me puedan quitar una duda.

Tengo una aplicación que recibe transacciones que deben
ser insertadas en una tabla de una bd en el sql server,
ahora esta aplicación desarrollada por un tercero crea
50 conexiones permanentes hacia el servidor argumentando
que asi es más rapida.

Bueno en mi simple Opinión pienso que no es necesario
mantener 50 conexiones si no 1 para enviar los insert.

Ahora puede darse el caso que lleguen 20 transacciones a
la vez para que sean insertados en la tabla, es más rapido
tener las 50 conexiones diferentes ó solo 1 para estas 20.


esa es mi duda y si alguien puede explicar por que les
agradeceria.

Gracias
Jimy
Respuesta Responder a este mensaje
#2 Jimy Campos
16/09/2004 - 19:23 | Informe spam
Hola Adrian,

Me parece adecuada tu respuesta, aclarando un poco más la
idea esta aplicación (Gateway) recibe por un puerto socket
una trama que lo que hace es registrarlo en una BD sql en
otro equipo, pero la aplicación (Gateway) la primera vez
que se levanta establece 50 conexiones permanentes.

Ahora esta me imagino recibe las tramas por el puerto del
socket puede recibir 1 como 100 al mismo momento, ahora
esta las repartira por diferentes conexiones dependiendo
de la llegada de las tramas eso imagino para que utilice
las 50 conexiones permanentes, ahora es ideal esto?
es mejor mantener solo una conexión y enviar por ahi si
vienen 100 al mismo instante las 100 ó si son secuenciales
enviarla secuencialmente en el orden de llegada.

Creo que teniendo 50 conexiones a la BD no significa
que el tiempo de respuesta de la BD sera mas rapido que
tenerlo por una sola.

Ahora con respecto al pool esta establece las 50 sesiones
o solo establece 1 pero puede manejar instancias
diferentes.

Gracis
JImy



La tecnica de crear una serie de conexiones y


manetenerlas en un "pool" no
es nueva. Lo extraño es que esos mecanismos ya estan


implementados en las
correspondientes librerias de acceso a datos (ODBC,


Ole/DB, ADO.NET). Mi
estimacion es que una conexion es reutilizada por unos 10


usuarios. Si hay
50 conexiones abiertas entonces estoy teniendo una carga


de 500 usuarios
aprox.

Ahora, si lo que esta haciendo la aplicacion es abrir 50


conexiones para
realizar 50 insert simultaneos sobre la misma tabla,


desde ya que la
performance se degradara por temas de lockeos y bloqueos


entre si.
Si recibo 20 transacciones al mismo tiempo es mucho mas


eficiente enviar los
20 insert en un mismo BATCH que enviarlos en forma


separada por 20
conexiones abiertas. Tambien consideraria el crear una


tabla temporal,
llenarla con las 20 filas y luego realizar un INSERT ...


SELECT de esta
tabla temporal. De esa forma todas las restricciones y


triggers se
evaluarian de una sola vez en vez de aplicarlos uno por


uno para cada fila.


Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Jimy Campos" wrote in message
news:16fd01c49c08$9212bef0$
Hola como estan amigos, espero me puedan quitar una duda.

Tengo una aplicación que recibe transacciones que deben
ser insertadas en una tabla de una bd en el sql server,
ahora esta aplicación desarrollada por un tercero crea
50 conexiones permanentes hacia el servidor argumentando
que asi es más rapida.

Bueno en mi simple Opinión pienso que no es necesario
mantener 50 conexiones si no 1 para enviar los insert.

Ahora puede darse el caso que lleguen 20 transacciones a
la vez para que sean insertados en la tabla, es más rapido
tener las 50 conexiones diferentes ó solo 1 para estas 20.


esa es mi duda y si alguien puede explicar por que les
agradeceria.

Gracias
Jimy


.

Respuesta Responder a este mensaje
#3 Jimy Campos
16/09/2004 - 22:05 | Informe spam
Adrian,

Muchas gracias has aclarado mis dudas y lo que dices es
muy cierto.
Ahora estoy revisando el tema de Pooling ODBC que me
mensionas.
http://www.15seconds.com/issue/961210.htm

Un gusto conocerte.

Un Abrazo, suerte.
Jimy Paul Campos Abad
Administrador de Red y Base de Datos
Procesos MC Perú S.A
Calle Porta 111 7mo Piso - Miraflores
Phone: +(511) 242-2700 Ext. 5223
Mobile: +(511) 972-12937
mailto:


Hola Jimy,
Una vez estuve haciendo una consultoria sobre un caso


similar al que
planteas. En ese entonces la aplicacion recibia una


transaccion probocada
por una llamada telefonica. El paquete que tenian que


recibir pertenecia al
protocolo de autenticacion Radius. La aplicacion abria


una serie de threads
cada cual con su conexion propia.

Aqui la gran pregunta es: una vez insertada la fila, cual


es el tiempo
minimo para que la misma vuelva a ser leida? Esto es


fundamental para
plantear la solucion correcta.
Si despues de insertar la fila, quizas en una fraccion de


segundo debo
volver a leerla, la solucion de ir generando un script


con varios INSERT no
es aplicable.
Lo que si haria es intentar utilizar el pool de


conexiones y si las
inserciones son criticas, sacar todos los


CONSTRAINS/RESTRICCIONES de la
tabla para que los mismos se ejecuten lo mas rapido


posible. Tambien
analizaria si la PK seleccionada es la mas adecuada


teniendo en cuenta la
modalidad de generacion de la misma. Tambien evitaria


cualquier trigger
sobre la tabla.

Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Jimy Campos" wrote in message
news:17be01c49c11$f315b640$
Hola Adrian,

Me parece adecuada tu respuesta, aclarando un poco más la
idea esta aplicación (Gateway) recibe por un puerto socket
una trama que lo que hace es registrarlo en una BD sql en
otro equipo, pero la aplicación (Gateway) la primera vez
que se levanta establece 50 conexiones permanentes.

Ahora esta me imagino recibe las tramas por el puerto del
socket puede recibir 1 como 100 al mismo momento, ahora
esta las repartira por diferentes conexiones dependiendo
de la llegada de las tramas eso imagino para que utilice
las 50 conexiones permanentes, ahora es ideal esto?
es mejor mantener solo una conexión y enviar por ahi si
vienen 100 al mismo instante las 100 ó si son secuenciales
enviarla secuencialmente en el orden de llegada.

Creo que teniendo 50 conexiones a la BD no significa
que el tiempo de respuesta de la BD sera mas rapido que
tenerlo por una sola.

Ahora con respecto al pool esta establece las 50 sesiones
o solo establece 1 pero puede manejar instancias
diferentes.

Gracis
JImy



La tecnica de crear una serie de conexiones y


manetenerlas en un "pool" no
es nueva. Lo extraño es que esos mecanismos ya estan


implementados en las
correspondientes librerias de acceso a datos (ODBC,


Ole/DB, ADO.NET). Mi
estimacion es que una conexion es reutilizada por unos 10


usuarios. Si hay
50 conexiones abiertas entonces estoy teniendo una carga


de 500 usuarios
aprox.

Ahora, si lo que esta haciendo la aplicacion es abrir 50


conexiones para
realizar 50 insert simultaneos sobre la misma tabla,


desde ya que la
performance se degradara por temas de lockeos y bloqueos


entre si.
Si recibo 20 transacciones al mismo tiempo es mucho mas


eficiente enviar los
20 insert en un mismo BATCH que enviarlos en forma


separada por 20
conexiones abiertas. Tambien consideraria el crear una


tabla temporal,
llenarla con las 20 filas y luego realizar un INSERT ...


SELECT de esta
tabla temporal. De esa forma todas las restricciones y


triggers se
evaluarian de una sola vez en vez de aplicarlos uno por


uno para cada fila.


Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Jimy Campos" wrote in message
news:16fd01c49c08$9212bef0$
Hola como estan amigos, espero me puedan quitar una duda.

Tengo una aplicación que recibe transacciones que deben
ser insertadas en una tabla de una bd en el sql server,
ahora esta aplicación desarrollada por un tercero crea
50 conexiones permanentes hacia el servidor argumentando
que asi es más rapida.

Bueno en mi simple Opinión pienso que no es necesario
mantener 50 conexiones si no 1 para enviar los insert.

Ahora puede darse el caso que lleguen 20 transacciones a
la vez para que sean insertados en la tabla, es más




rapido
tener las 50 conexiones diferentes ó solo 1 para estas




20.


esa es mi duda y si alguien puede explicar por que les
agradeceria.

Gracias
Jimy


.





.

Respuesta Responder a este mensaje
#4 Adrian D. Garcia
16/09/2004 - 23:12 | Informe spam
La tecnica de crear una serie de conexiones y manetenerlas en un "pool" no
es nueva. Lo extraño es que esos mecanismos ya estan implementados en las
correspondientes librerias de acceso a datos (ODBC, Ole/DB, ADO.NET). Mi
estimacion es que una conexion es reutilizada por unos 10 usuarios. Si hay
50 conexiones abiertas entonces estoy teniendo una carga de 500 usuarios
aprox.

Ahora, si lo que esta haciendo la aplicacion es abrir 50 conexiones para
realizar 50 insert simultaneos sobre la misma tabla, desde ya que la
performance se degradara por temas de lockeos y bloqueos entre si.
Si recibo 20 transacciones al mismo tiempo es mucho mas eficiente enviar los
20 insert en un mismo BATCH que enviarlos en forma separada por 20
conexiones abiertas. Tambien consideraria el crear una tabla temporal,
llenarla con las 20 filas y luego realizar un INSERT ... SELECT de esta
tabla temporal. De esa forma todas las restricciones y triggers se
evaluarian de una sola vez en vez de aplicarlos uno por uno para cada fila.


Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Jimy Campos" wrote in message
news:16fd01c49c08$9212bef0$
Hola como estan amigos, espero me puedan quitar una duda.

Tengo una aplicación que recibe transacciones que deben
ser insertadas en una tabla de una bd en el sql server,
ahora esta aplicación desarrollada por un tercero crea
50 conexiones permanentes hacia el servidor argumentando
que asi es más rapida.

Bueno en mi simple Opinión pienso que no es necesario
mantener 50 conexiones si no 1 para enviar los insert.

Ahora puede darse el caso que lleguen 20 transacciones a
la vez para que sean insertados en la tabla, es más rapido
tener las 50 conexiones diferentes ó solo 1 para estas 20.


esa es mi duda y si alguien puede explicar por que les
agradeceria.

Gracias
Jimy
Respuesta Responder a este mensaje
#5 Adrian D. Garcia
17/09/2004 - 01:07 | Informe spam
Hola Jimy,
Una vez estuve haciendo una consultoria sobre un caso similar al que
planteas. En ese entonces la aplicacion recibia una transaccion probocada
por una llamada telefonica. El paquete que tenian que recibir pertenecia al
protocolo de autenticacion Radius. La aplicacion abria una serie de threads
cada cual con su conexion propia.

Aqui la gran pregunta es: una vez insertada la fila, cual es el tiempo
minimo para que la misma vuelva a ser leida? Esto es fundamental para
plantear la solucion correcta.
Si despues de insertar la fila, quizas en una fraccion de segundo debo
volver a leerla, la solucion de ir generando un script con varios INSERT no
es aplicable.
Lo que si haria es intentar utilizar el pool de conexiones y si las
inserciones son criticas, sacar todos los CONSTRAINS/RESTRICCIONES de la
tabla para que los mismos se ejecuten lo mas rapido posible. Tambien
analizaria si la PK seleccionada es la mas adecuada teniendo en cuenta la
modalidad de generacion de la misma. Tambien evitaria cualquier trigger
sobre la tabla.

Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Jimy Campos" wrote in message
news:17be01c49c11$f315b640$
Hola Adrian,

Me parece adecuada tu respuesta, aclarando un poco más la
idea esta aplicación (Gateway) recibe por un puerto socket
una trama que lo que hace es registrarlo en una BD sql en
otro equipo, pero la aplicación (Gateway) la primera vez
que se levanta establece 50 conexiones permanentes.

Ahora esta me imagino recibe las tramas por el puerto del
socket puede recibir 1 como 100 al mismo momento, ahora
esta las repartira por diferentes conexiones dependiendo
de la llegada de las tramas eso imagino para que utilice
las 50 conexiones permanentes, ahora es ideal esto?
es mejor mantener solo una conexión y enviar por ahi si
vienen 100 al mismo instante las 100 ó si son secuenciales
enviarla secuencialmente en el orden de llegada.

Creo que teniendo 50 conexiones a la BD no significa
que el tiempo de respuesta de la BD sera mas rapido que
tenerlo por una sola.

Ahora con respecto al pool esta establece las 50 sesiones
o solo establece 1 pero puede manejar instancias
diferentes.

Gracis
JImy



La tecnica de crear una serie de conexiones y


manetenerlas en un "pool" no
es nueva. Lo extraño es que esos mecanismos ya estan


implementados en las
correspondientes librerias de acceso a datos (ODBC,


Ole/DB, ADO.NET). Mi
estimacion es que una conexion es reutilizada por unos 10


usuarios. Si hay
50 conexiones abiertas entonces estoy teniendo una carga


de 500 usuarios
aprox.

Ahora, si lo que esta haciendo la aplicacion es abrir 50


conexiones para
realizar 50 insert simultaneos sobre la misma tabla,


desde ya que la
performance se degradara por temas de lockeos y bloqueos


entre si.
Si recibo 20 transacciones al mismo tiempo es mucho mas


eficiente enviar los
20 insert en un mismo BATCH que enviarlos en forma


separada por 20
conexiones abiertas. Tambien consideraria el crear una


tabla temporal,
llenarla con las 20 filas y luego realizar un INSERT ...


SELECT de esta
tabla temporal. De esa forma todas las restricciones y


triggers se
evaluarian de una sola vez en vez de aplicarlos uno por


uno para cada fila.


Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Jimy Campos" wrote in message
news:16fd01c49c08$9212bef0$
Hola como estan amigos, espero me puedan quitar una duda.

Tengo una aplicación que recibe transacciones que deben
ser insertadas en una tabla de una bd en el sql server,
ahora esta aplicación desarrollada por un tercero crea
50 conexiones permanentes hacia el servidor argumentando
que asi es más rapida.

Bueno en mi simple Opinión pienso que no es necesario
mantener 50 conexiones si no 1 para enviar los insert.

Ahora puede darse el caso que lleguen 20 transacciones a
la vez para que sean insertados en la tabla, es más rapido
tener las 50 conexiones diferentes ó solo 1 para estas 20.


esa es mi duda y si alguien puede explicar por que les
agradeceria.

Gracias
Jimy


.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida