Consulta por lentitud en los inserts

04/01/2008 - 20:18 por marcelo | Informe spam
Hola,

Mi consulta es la siguiente: tengo desarrollada una aplicación en VB6 que
lee archivos de registros variables secuencialmente y carga la información
en una base de datos SQLServer 2005.

La cuestión es que antes la aplicación corría en una pc vieja, con SQLServer
2000, y "andaba lento" el proceso.
Ahora se migró a un servidor mucho mas potente y con SQLServer 2005 y sigue
andando a la misma velocidad.

No logro acelerar la velocidad de la aplicación, y estoy chequeando qué
puedo llegar a optimizar del lado de la base de datos, todos los insert se
hacen por medio de stored procedures.

Basicamente los pasos para cada insert son los siguientes, la aplicación
actualiza dos tablas por cada registro a insertar:
Calcula el maximo ID para la tabla 1
Calcula el maximo ID para la tabla 2
ejecuta insert de la tabla 1
ejecuta insert de la tabla 2

La base se depura cada X dias por lo que la cantidad de registros no crece
en volumen...la tabla mas grande puede llegar a tener 500.000 registros.

Actualmente cada tabla tiene unos 3 o 4 indices para las consultas...
Tambien quisiera saber que tengo que tener en cuenta para saber si los
indices estan bien creados...

Cualquier consejo sobre como detectar los cuellos de botellas seran
bienvenidos

desde ya, muchas gracias.

Preguntas similare

Leer las respuestas

#1 Carlos A.
05/01/2008 - 16:23 | Informe spam
Marcelo:
Por que no realiza una traza (profiler) y ejecuta las sentencias una a una.
de esta forma podra determinar cual de las consultas se esta demorando.
Una vez tenga claras las sentencias demoradas, apóyese con el index tunning
wizard. este utilitario le dará una visión un poco mas amplia de lo que puede
mejorar.
Otra cosa es que revise las indices de las tablas (especialmente los indices
cluster), si es posible cambielos a nocluster.

Tambien revise a través de DBCC SHOWCONTIG la fragmentación de los indices
enlos BOL encontrará más detalles de este DBCC.

Si la fragmentación está muy alta entonces por favor ejecute DBCC DBREINDEX
de las tablas. y por último UPDATE STATISTICS WITH FULLSCAN

Una vez haya ejecutado estos pasos verá que el rendimiento mejorará
notablemente.

Por último, programe DBCC DBREINDEX y UPDATE STATISTICS con cierta
regularidad.

saludos,

"marcelo" wrote:

Hola,

Mi consulta es la siguiente: tengo desarrollada una aplicación en VB6 que
lee archivos de registros variables secuencialmente y carga la información
en una base de datos SQLServer 2005.

La cuestión es que antes la aplicación corría en una pc vieja, con SQLServer
2000, y "andaba lento" el proceso.
Ahora se migró a un servidor mucho mas potente y con SQLServer 2005 y sigue
andando a la misma velocidad.

No logro acelerar la velocidad de la aplicación, y estoy chequeando qué
puedo llegar a optimizar del lado de la base de datos, todos los insert se
hacen por medio de stored procedures.

Basicamente los pasos para cada insert son los siguientes, la aplicación
actualiza dos tablas por cada registro a insertar:
Calcula el maximo ID para la tabla 1
Calcula el maximo ID para la tabla 2
ejecuta insert de la tabla 1
ejecuta insert de la tabla 2

La base se depura cada X dias por lo que la cantidad de registros no crece
en volumen...la tabla mas grande puede llegar a tener 500.000 registros.

Actualmente cada tabla tiene unos 3 o 4 indices para las consultas...
Tambien quisiera saber que tengo que tener en cuenta para saber si los
indices estan bien creados...

Cualquier consejo sobre como detectar los cuellos de botellas seran
bienvenidos

desde ya, muchas gracias.



Respuesta Responder a este mensaje
#2 marcelo
07/01/2008 - 20:46 | Informe spam
Gracias Carlos por tu respuesta, mis comentarios abajo

"Carlos A." wrote in message
news:
Marcelo:
Por que no realiza una traza (profiler) y ejecuta las sentencias una a
una.
de esta forma podra determinar cual de las consultas se esta demorando.
Una vez tenga claras las sentencias demoradas, apóyese con el index
tunning
wizard. este utilitario le dará una visión un poco mas amplia de lo que
puede
mejorar.



En realidad no veo demora sustancial en la ejecución de las sentencias como
para diferenciarlas

Otra cosa es que revise las indices de las tablas (especialmente los
indices
cluster), si es posible cambielos a nocluster.



como me doy cuenta si lo puedo cambiar a nocluster? en que caso deben quedar
nocluster?

Tambien revise a través de DBCC SHOWCONTIG la fragmentación de los indices
enlos BOL encontrará más detalles de este DBCC.



Showcontig me muestra estos datos para todas las tablas mas o menos
parecido:
TABLE level scan performed.

- Pages Scanned: 6

- Extents Scanned..: 6

- Extent Switches..: 5

- Avg. Pages per Extent: 1.0

- Scan Density [Best Count:Actual Count]...: 16.67% [1:6]

- Logical Scan Fragmentation ..: 83.33%

- Extent Scan Fragmentation ...: 66.67%

- Avg. Bytes Free per Page.: 1020.8

- Avg. Page Density (full).: 87.39%



Si la fragmentación está muy alta entonces por favor ejecute DBCC
DBREINDEX
de las tablas. y por último UPDATE STATISTICS WITH FULLSCAN



ejecuto dbreindex ('nombreTabla') y update statistics 'nombreTabla' with
fullscan (aunque acabo de leer que el dbreindex hace automaticamente el
update statistics) y la información del showContig no cambia...por que puede
ser?


Desde ya muchas.
Saludos,
Marcelo



Una vez haya ejecutado estos pasos verá que el rendimiento mejorará
notablemente.

Por último, programe DBCC DBREINDEX y UPDATE STATISTICS con cierta
regularidad.

saludos,

"marcelo" wrote:

Hola,

Mi consulta es la siguiente: tengo desarrollada una aplicación en VB6 que
lee archivos de registros variables secuencialmente y carga la
información
en una base de datos SQLServer 2005.

La cuestión es que antes la aplicación corría en una pc vieja, con
SQLServer
2000, y "andaba lento" el proceso.
Ahora se migró a un servidor mucho mas potente y con SQLServer 2005 y
sigue
andando a la misma velocidad.

No logro acelerar la velocidad de la aplicación, y estoy chequeando qué
puedo llegar a optimizar del lado de la base de datos, todos los insert
se
hacen por medio de stored procedures.

Basicamente los pasos para cada insert son los siguientes, la aplicación
actualiza dos tablas por cada registro a insertar:
Calcula el maximo ID para la tabla 1
Calcula el maximo ID para la tabla 2
ejecuta insert de la tabla 1
ejecuta insert de la tabla 2

La base se depura cada X dias por lo que la cantidad de registros no
crece
en volumen...la tabla mas grande puede llegar a tener 500.000 registros.

Actualmente cada tabla tiene unos 3 o 4 indices para las consultas...
Tambien quisiera saber que tengo que tener en cuenta para saber si los
indices estan bien creados...

Cualquier consejo sobre como detectar los cuellos de botellas seran
bienvenidos

desde ya, muchas gracias.



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