Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Velocidad de respuesta de servidor (https://www.clubdelphi.com/foros/showthread.php?t=38977)

nfrfabian 06-01-2007 20:19:47

Velocidad de respuesta de servidor
 
Hola a todos. Muchas gracias por su ayuda. Mi problema es el siguiente.
Trabajo con Ms SQL Server 2005, me conecto por medio de Ado. Yo solia usar Adotables para la conexion con las tablas, pero viendo los consejos de ustedes parece que es mucho mas rapido el tiempo de respuesta del servidor cuando se usa una adoquery porque el servidor solo envia a mi aplicacion el resultado de mi consulta y no toda la tabla. En fin tengo 2 tablas: maestro - detalle, como yo trabajaba con adotable a la tabla detalle le ponia como mastersource el datasource de la tabla maestro. Al pasar esta relacion a adoquery tuve problemas. Leyendo un poco la ayuda de delphi arme la relacion de la siguiente forma:
tengo las siguientes tablas en el servidor:

- resumen: dia, horain, grupo, idnom, hingresada, confir, fechreser, nrocontrol, operacion, activo.

- clientes: idnombre, nombre, nombre2, apellido, telefono

- agenda: dia, gabinete, hora, grupo, idnom, idprofesio, idservicio

- componente adoquery adoqresu
En el valor de la propiedad (TWideStrings) del adoqresu pongo: select dia, horain, grupo, idnom, hingresada, confir, fechreser, nrocontrol, operacion, activo, idnombre, nombre, nombre2, apellido, telefono from resumen, clientes where (dia = :fecha) and (activo = 'True') and (idnombre = idnom)

Puse un valor "fecha" a la propiedad (Tparameters) del adoqresu, este valor lo uso para elegir el dia en que se va a realizar la consulta de resumen.
Esta forma es la que explica la Ayuda de Delphi, nose si habra otra mas rapida o mejor.

- componente adoquery adoagenda
En el valor de la propiedad (TWideStrings) del adoagenda pongo: select dia, gabinete, hora, grupo, idnom, idprofesio, idservicio from agenda where dia = :fecha and idnom = :idnombre

El boton que realiza los calculos tiene las siguientes instrucciones:

adoqresu.Active := false;
adoqresu.Parameters[0].value := varifecha;
adoqresu.active := true;

while not adoqresu.Eof do
begin
adoqclientes.Active := false;
adoqclientes.Parameters[0].Value := varifecha;
adoqclientes.Parameters[1].Value := adoqresu.fields[3].value;
adoqclientes.Active := true;
while not adoqclientes.eof do
begin
calcularresultado; // calcularresultado solo cuenta la cantidad de cada idservicios
adoqclientes.next;
end;
adoqclientes.next;
end;


Este procedimiento funciona aceptablemente cuando la cantidad de registros que tiene tanto la tabla resumen y agenda son pocos. Pero con una tabla resumen con 12000 y agenda con 60000 registros aprox. y despues de realizar la consulta y devolver en promedio "solo" 200 registros aprox. el servidor se tarda entre 5 y 15 segundos.
Me parece que un servidor que se demore 5 segundos en devolverte 200 registros sin nada pesado (imagen o cosa por el estilo, solo datos del tipo smallint o varchar) no es un servidor que funcione correctamente. O el servidor funciona mal o la consulta esta mal hecha o no estoy utilizando los componentes correctos o las funciones de los componentes que uso no son las correctas.
Yo tengo la esperanza que el problema sea falta de recursos de pc, tengo en una sola computadora con 1gb de ram y procesador athlon de 2100 ejecutando el servidor sql server y mi aplicacion. Se que la memoria minima no es suficiente pero para pruebas pense que no afectaria tanto al rendimiento de mi aplicacion. Pero antes de comprar una computadora mas nueva quiero estar seguro que el problema es ese.
Desde ya gracias por sus consejo y disculpen lo largo consulta. Gracias.

Casimiro Notevi 06-01-2007 23:18:21

No hace falta que compres ninguna máquina nueva, esa es suficiente.

Deberías probar por separado, sentencia a sentencia, para ver en cuál exactamente se produce el retardo y actuar sobre ella.

Lepe 07-01-2007 04:50:16

Además, deberías indicar qué índices tienes definidos, o quizás definir índices sobre los campos que son muy usados en las búsquedas. Ésta es una parte importante.

Saludos

nfrfabian 07-01-2007 15:31:52

Hola, gracias por ayudarme. En cuanto a lo que me preguntan. Las lineas en donde se demora en ejecutar son justamente las que activan la consulta:

adoqclientes.Active := true;

En cuanto a los indices defini indices en los campos por los cual queria que se ordenara, en la de adoqresu en en campo horain, en adoqclientes en hora. Tambien pense que si definia los indices en estos campos el servidor los ordenaria por esos campos y al hacer las consultas no tendria que poner al final de la consulta "order by horain" y "order by hora", pero como no me devolvia la consulta ordenada tuve que poner al final "order by ..." y esto hace que se demora mas, incluso cuando hago consultas que me devuelven solo 3 registros se demora 3 a 5 segundos, es mas a veces ni siquiera me los ordena bien, hay veces en que realizo la consulta por un dia determinado y a veces me devuelve ordenado y hay veces en que no. No me queda pensar otra que es problema del servidor.
A menos que tambien tenga que definir indices para los campos dia en ambas tablas y al hacer el "order by" tambien tenga que poner el "dia" :

select dia, horain, grupo, idnom, hingresada, confir, fechreser, nrocontrol, operacion, activo, idnombre, nombre, nombre2, apellido, telefono from resumen, clientes where (dia = :fecha) and (activo = 'True') and (idnombre = idnom) order by horain
a esta consulta reemplazaria el final "order by horain" por "order by dia and horain", pero hacer esto me parece redundante porque estoy filtrando para que me mustre los registros de un dia determinado, ademas de que seguro va tardar mas en devolverme la cosulta. Pero nose que mas probar para que me devuelva la consulta ordenada siempre. No me queda otra mas que seguir probando. Gracias por cualquier consejo.

Lepe 08-01-2007 12:01:46

¿Tienes claves primarias definidas?

¿Qué SQL tienes en adoclientes? ¿Que hace CalculaResultados? Está claro que ahí es donde tienes el cuello de botella, ya que por cada registro de la consulta resumen, abres y cierras el adoclientes y encima después por cada registro, calculas el resultado.

La optimización vendría por hacer un sql que unificara todo si es posible. Si no es posible.... a procedimientos almacenados.

Saludos

fjcg02 09-01-2007 00:55:24

Un par de cosas
- Pon indices en los campos que hacen de claves en las tablas. Ejemplo, Cliente.IdNombre y Agenda.Dia.Poner indices en los campos por los que ordenas generalmente no acelera nada.
- Cuando uses querys siempre tendrás que ordenar la consulta, no funciona igual que una tabla con un indice activo.
- Cuando tengas que 'contar ' registros no lo hagas a 'pelo'. Utiliza consultas que te devuelvan los valores y que se ejecuten en cada cambio de datos. Para ello utiliza select count(campo) where condicion ( la condicion puede ser parametrizada )
- Con querys tambien funciona el mastersource.

Suerte
Un saludo

nfrfabian 10-01-2007 00:51:46

Hola, gracias por sus consejos, pude mejorar la velocidad de respuesta agregandole indices a los campos por los que pongo el filtro (dia, hora, horain).


La franja horaria es GMT +2. Ahora son las 06:48:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi