Bloqueos en SQL Server 7.0

12/08/2003 - 21:14 por EDY | Informe spam
Qué tal !!

Tengo un problema con mi aplicación ASP, COM+ y SQL
Server, es una aplicación Punto de Venta y su medio de
comunicación es Internet, las sucursales accesan al
servidor por medio de la línea telefónica.

Lo que pasa es que tengo una tabla "Inventarios" y en ella
como se imaginan contiene información acerca de las
existencia de los productos y por lo tanto cada vez que se
realiza una venta o algún proceso que afecte el
inventario, esta tabla es afectada. Resulta ser que cuando
se realizan Ajustes al inventario a diferentes sucursales
el sistema se vuelve notoriamente más lento al momento de
generar ventas, he estado revisando mi código(DLL de VB y
COM+) y veo que por cada producto que se le va a modificar
su existencia abre una conexión a la BD, modifica la
existencia del producto y actualiza el registro de otra
tabla que guarda el producto, la fecha de ajuste, la
cantidad ajustada y la cantidad anterior.

Todo eso por cada partida.

Comunmente se realizan ajustes(inventarios) al rededor de
300 productos y se van realizando en bloques de 50pzas.

Mi problema es el rendimiento en mi server y por supuesto
mi conexión(que es la línea telefónica), sin embargo en
nuestro corporativo se tiene un enlace dedicado a 128,
además de que como nuestra aplicación es en tres capas, el
procesamiento de los datos se realiza en nuestro server.

Cuando realizamos consultas a las existencia mientras se
realizan inventarios, notamos que el sistema se vuelve
lento. Ahora bien, estoy suponiendo que como la
tabla "Inventarios" es una tabla en constante operación,
sufre de muchos bloqueos por parte del server y eso hace
que el rendimiento se deteriore.


Ustedes cómo ven, según yo, es el bloqueo que sufre la
Tabla "Inventarios" por tanta concurrencia, es cierto que
mis conexiones son lentas, pero el procesamiento lo
realiza el server no mi aplicación cliente.

Espero me puedan dar su comentario.

SALUDOS !!!

EDY

Preguntas similare

Leer las respuestas

#1 Javier Loria\(MVP\)
12/08/2003 - 22:18 | Informe spam
Hola Edy:
Dependiendo de como este escrito el codigo puede ser el problema:
a) Si el codigo esta corriendo en el IIS el unico que se conecta es el
servidor IIS ya sea con su cuenta de usuario de Windows o de SQL no deberia
dar ningun problema. La razon es que el OLE-DB y ODBC te ofrece "conexion
pooling" de manera que si usas la misma setencia de conexion (Tiene que ser
EXACTAMENTE igual). Si el IIS esta usando la cuenta de usuario entonces si
podria significar un problema.
b) Si lo anterior no es problema es muy posible que tengas una situacion
de bloqueos. Si estas usando ASP y COM que como tienes configurado el
bloqueo? (optimista o pesimista) y donde usas el cursor? (cliente o
servidor)
Una posiblidad es mover el codigo de actualizacion unicamente a un
Procedimiento para reducir al minimo el bloqueo.

Saludos,



Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

EDY escribio:
Qué tal !!

Tengo un problema con mi aplicación ASP, COM+ y SQL
Server, es una aplicación Punto de Venta y su medio de
comunicación es Internet, las sucursales accesan al
servidor por medio de la línea telefónica.

Lo que pasa es que tengo una tabla "Inventarios" y en ella
como se imaginan contiene información acerca de las
existencia de los productos y por lo tanto cada vez que se
realiza una venta o algún proceso que afecte el
inventario, esta tabla es afectada. Resulta ser que cuando
se realizan Ajustes al inventario a diferentes sucursales
el sistema se vuelve notoriamente más lento al momento de
generar ventas, he estado revisando mi código(DLL de VB y
COM+) y veo que por cada producto que se le va a modificar
su existencia abre una conexión a la BD, modifica la
existencia del producto y actualiza el registro de otra
tabla que guarda el producto, la fecha de ajuste, la
cantidad ajustada y la cantidad anterior.

Todo eso por cada partida.

Comunmente se realizan ajustes(inventarios) al rededor de
300 productos y se van realizando en bloques de 50pzas.

Mi problema es el rendimiento en mi server y por supuesto
mi conexión(que es la línea telefónica), sin embargo en
nuestro corporativo se tiene un enlace dedicado a 128,
además de que como nuestra aplicación es en tres capas, el
procesamiento de los datos se realiza en nuestro server.

Cuando realizamos consultas a las existencia mientras se
realizan inventarios, notamos que el sistema se vuelve
lento. Ahora bien, estoy suponiendo que como la
tabla "Inventarios" es una tabla en constante operación,
sufre de muchos bloqueos por parte del server y eso hace
que el rendimiento se deteriore.


Ustedes cómo ven, según yo, es el bloqueo que sufre la
Tabla "Inventarios" por tanta concurrencia, es cierto que
mis conexiones son lentas, pero el procesamiento lo
realiza el server no mi aplicación cliente.

Espero me puedan dar su comentario.

SALUDOS !!!

EDY
Respuesta Responder a este mensaje
#2 EDY
12/08/2003 - 22:41 | Informe spam
Hola Javier, gracias por tu tiempo.

Mira, yo no utilizo cursores, yo tengo un sp en el server
el cual realiza la actualización a las tablas. Este sp es
llamado desde un componente para cada producto
seleccionado.

La conexión a la BD se realiza con una misma cuenta.

SALUDOS !!



Hola Edy:
Dependiendo de como este escrito el codigo puede ser


el problema:
a) Si el codigo esta corriendo en el IIS el unico que


se conecta es el
servidor IIS ya sea con su cuenta de usuario de Windows o


de SQL no deberia
dar ningun problema. La razon es que el OLE-DB y ODBC te


ofrece "conexion
pooling" de manera que si usas la misma setencia de


conexion (Tiene que ser
EXACTAMENTE igual). Si el IIS esta usando la cuenta de


usuario entonces si
podria significar un problema.
b) Si lo anterior no es problema es muy posible que


tengas una situacion
de bloqueos. Si estas usando ASP y COM que como tienes


configurado el
bloqueo? (optimista o pesimista) y donde usas el cursor?


(cliente o
servidor)
Una posiblidad es mover el codigo de actualizacion


unicamente a un
Procedimiento para reducir al minimo el bloqueo.

Saludos,



Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

EDY escribio:
Qué tal !!

Tengo un problema con mi aplicación ASP, COM+ y SQL
Server, es una aplicación Punto de Venta y su medio de
comunicación es Internet, las sucursales accesan al
servidor por medio de la línea telefónica.

Lo que pasa es que tengo una tabla "Inventarios" y en




ella
como se imaginan contiene información acerca de las
existencia de los productos y por lo tanto cada vez que




se
realiza una venta o algún proceso que afecte el
inventario, esta tabla es afectada. Resulta ser que




cuando
se realizan Ajustes al inventario a diferentes




sucursales
el sistema se vuelve notoriamente más lento al momento




de
generar ventas, he estado revisando mi código(DLL de VB




y
COM+) y veo que por cada producto que se le va a




modificar
su existencia abre una conexión a la BD, modifica la
existencia del producto y actualiza el registro de otra
tabla que guarda el producto, la fecha de ajuste, la
cantidad ajustada y la cantidad anterior.

Todo eso por cada partida.

Comunmente se realizan ajustes(inventarios) al rededor




de
300 productos y se van realizando en bloques de 50pzas.

Mi problema es el rendimiento en mi server y por




supuesto
mi conexión(que es la línea telefónica), sin embargo en
nuestro corporativo se tiene un enlace dedicado a 128,
además de que como nuestra aplicación es en tres capas,




el
procesamiento de los datos se realiza en nuestro server.

Cuando realizamos consultas a las existencia mientras se
realizan inventarios, notamos que el sistema se vuelve
lento. Ahora bien, estoy suponiendo que como la
tabla "Inventarios" es una tabla en constante operación,
sufre de muchos bloqueos por parte del server y eso hace
que el rendimiento se deteriore.


Ustedes cómo ven, según yo, es el bloqueo que sufre la
Tabla "Inventarios" por tanta concurrencia, es cierto




que
mis conexiones son lentas, pero el procesamiento lo
realiza el server no mi aplicación cliente.

Espero me puedan dar su comentario.

SALUDOS !!!

EDY




.

Respuesta Responder a este mensaje
#3 Javier Loria\(MVP\)
12/08/2003 - 23:57 | Informe spam
Hola Eddy:
Me alegra mucho que no utilices cursores, mucha gente que trabaja con
VB, Interdev y en general ADO no sabe que cuando construye sus recordsets y
los fija del lado del servidor, en realidad esta haciendo un cursor y eso
produce problemas de de desempeno muy serios.
Si quieres asegurarte que NO es un problema de bloqueos prueba
monitoreando los siguientes estadisticas en el Performance Monitor:
SQLServer:Locks-Average Wait Time y SQLServer:Locks- Locks Waits/sec. El
primero te da cuanto tiempo en promedio dura un bloqueo y el segundo cuantos
bloqueos tuvieron que esperar para realizarse (porque el recurso ya estaba
bloqueado).
En este caso ambos valores es deseable que sean el minimo (0 es perfecto
pero poco probable). Si estas en el rango de menos de 5 segundos (5000
milisegundo) y menos de una decena por segundo, yo buscaria en otro lado el
problema.
Saludos,


Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.\

EDY escribio:
Hola Javier, gracias por tu tiempo.

Mira, yo no utilizo cursores, yo tengo un sp en el server
el cual realiza la actualización a las tablas. Este sp es
llamado desde un componente para cada producto
seleccionado.

La conexión a la BD se realiza con una misma cuenta.

SALUDOS !!



Hola Edy:
Dependiendo de como este escrito el codigo puede ser el problema:
a) Si el codigo esta corriendo en el IIS el unico que se conecta
es el servidor IIS ya sea con su cuenta de usuario de Windows o de
SQL no deberia dar ningun problema. La razon es que el OLE-DB y ODBC
te ofrece "conexion pooling" de manera que si usas la misma setencia
de conexion (Tiene que ser EXACTAMENTE igual). Si el IIS esta usando
la cuenta de usuario entonces si podria significar un problema.
b) Si lo anterior no es problema es muy posible que tengas una
situacion de bloqueos. Si estas usando ASP y COM que como tienes
configurado el bloqueo? (optimista o pesimista) y donde usas el
cursor? (cliente o servidor)
Una posiblidad es mover el codigo de actualizacion unicamente
a un Procedimiento para reducir al minimo el bloqueo.

Saludos,



Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

EDY escribio:
Qué tal !!

Tengo un problema con mi aplicación ASP, COM+ y SQL
Server, es una aplicación Punto de Venta y su medio de
comunicación es Internet, las sucursales accesan al
servidor por medio de la línea telefónica.

Lo que pasa es que tengo una tabla "Inventarios" y en ella
como se imaginan contiene información acerca de las
existencia de los productos y por lo tanto cada vez que se
realiza una venta o algún proceso que afecte el
inventario, esta tabla es afectada. Resulta ser que cuando
se realizan Ajustes al inventario a diferentes sucursales
el sistema se vuelve notoriamente más lento al momento de
generar ventas, he estado revisando mi código(DLL de VB y
COM+) y veo que por cada producto que se le va a modificar
su existencia abre una conexión a la BD, modifica la
existencia del producto y actualiza el registro de otra
tabla que guarda el producto, la fecha de ajuste, la
cantidad ajustada y la cantidad anterior.

Todo eso por cada partida.

Comunmente se realizan ajustes(inventarios) al rededor de
300 productos y se van realizando en bloques de 50pzas.

Mi problema es el rendimiento en mi server y por supuesto
mi conexión(que es la línea telefónica), sin embargo en
nuestro corporativo se tiene un enlace dedicado a 128,
además de que como nuestra aplicación es en tres capas, el
procesamiento de los datos se realiza en nuestro server.

Cuando realizamos consultas a las existencia mientras se
realizan inventarios, notamos que el sistema se vuelve
lento. Ahora bien, estoy suponiendo que como la
tabla "Inventarios" es una tabla en constante operación,
sufre de muchos bloqueos por parte del server y eso hace
que el rendimiento se deteriore.


Ustedes cómo ven, según yo, es el bloqueo que sufre la
Tabla "Inventarios" por tanta concurrencia, es cierto que
mis conexiones son lentas, pero el procesamiento lo
realiza el server no mi aplicación cliente.

Espero me puedan dar su comentario.

SALUDOS !!!

EDY




.
Respuesta Responder a este mensaje
#4 Hernan Nieto
14/08/2003 - 17:42 | Informe spam
Javier:

Disculpa que me "adjunte" a este hilo, yo con Ado estoy utilizando
Recordset, y vos decis que esto afecta mucho el rendimiento de la
aplicacion, me podrias indicar que otras alternativas existen para el acceso
a datos, y cual es el rendimiento de las mismas?.

Gracias
Respuesta Responder a este mensaje
#5 Javier Loria\(MVP\)
15/08/2003 - 03:39 | Informe spam
Hola Hernan:
Con mucho gusto.
ADO siempre usa cursores, los puedes configurar en el cliente que esta
bien, y los del servidor en cuyo caso hay tener mucho cuidado por el
impacto. No es que sean malos es que consumen importantisimos recursos en el
servidor.
La forma de configurarlos es muy sencilla, si se esta usando
directamente el objeto RecordSet, busca la propiedad CursorLocation. Si
tienes duda o si no tienes el codigo fuente o es mucho que revisar. Usa el
Profile, inicia una traza y capturas el evento de Cursor:Open para buscar
posibles culpables.
Las alternativas: decirlas es muy facil, construirlas no tanto. Usa
procedimientos almacenados, para Seleccionar, Insertar, Actualizar y Borrar.
Si quieres hacer mucho mas facil esto pasate a VB.NET, que tiene este
comportamiento y con un clic derecho y tres izquierdos configura casi todo.
Saludos,


Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Hernan Nieto escribio:
Javier:

Disculpa que me "adjunte" a este hilo, yo con Ado estoy utilizando
Recordset, y vos decis que esto afecta mucho el rendimiento de la
aplicacion, me podrias indicar que otras alternativas existen para el
acceso a datos, y cual es el rendimiento de las mismas?.

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