Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-01-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 18
nfrfabian Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 06-01-2007
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #3  
Antiguo 07-01-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #4  
Antiguo 07-01-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 18
nfrfabian Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 08-01-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
¿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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 09-01-2007
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.409
Poder: 22
fjcg02 Va camino a la fama
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
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #7  
Antiguo 10-01-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 18
nfrfabian Va por buen camino
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).
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Dar tiempo de respuesta a una consulta Eolo Conexión con bases de datos 2 19-02-2004 15:30:15
La mejor respuesta de Exámen. obiwuan Humor 1 08-08-2003 19:09:39
Respuesta danytorres Varios 2 16-07-2003 20:55:43


La franja horaria es GMT +2. Ahora son las 08:06:04.


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
Copyright 1996-2007 Club Delphi