Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Maestro/Detalle muy lento ADSL (https://www.clubdelphi.com/foros/showthread.php?t=71804)

tec 11-01-2011 22:37:17

Maestro/Detalle muy lento ADSL
 
En una base de datos firebird 2.5 me tarda mucho en hacer un maestro/detalle, tal era que lo cambié por otra forma, pero todavía es lento
cuando se accede a la base de datos por Ip (ADSL 6 MB).

Tengo 2 TSimpleDataSet conectados cada uno a un dbgrid.

TaulaC.Add('SELECT * FROM albaran where empresa='+emp);
TaulaC.Add('AND ALB_CLI='+clieTic);
TaulaC.Add('Order by ALB_FEC');

En el evento albaranAfterScroll(DataSet: TDataSet)

TaulaCl.DataSet.CommandText:='SELECT * FROM lineas WHERE LIN_CLAVE='+QuotedStr(TaulaC.FieldByName('ALB_CLAVE').AsString)+
' AND EMPRESA='+emp_act+' order by LIN_NUM';

Las 2 tablas tienen indices correctos.

Alguién sabe como puedo arreglar este problema ?

Un saludo.

Casimiro Noteví 11-01-2011 23:25:45

Cita:

Empezado por tec (Mensaje 387224)
Alguién sabe como puedo arreglar este problema ?

Sí, no trabajando por internet :D

Bromas aparte, para trabajar cliente/servidor debes optimizar mucho las consultas para que que sólo viaje por la red lo único e imprescindible, no puedes pretender trabajar como si fuese una red local. Bueno, sí, cuando internet sea de 100 megabits.
Hay cosas simples que tienes que erradicar, por ejemplo, "select *", eso no debe hacerse nunca.
Por supuesto, también enlentece muchísimo los maestros/detalles que has comentado, los dblookupcombobox, las tablas, los grids que se traen todos los registros, etc.
Resumiendo, tienes que optimizar muchísimo tus sqls.

Gallosuarez 12-01-2011 00:39:50

Otras sugerencias...
 
tec:

Es correcto lo que menciona Casimiro Noteví, además que no veo por ningún lado que prepares tus sentencias SQL (prepare statement). Esto lo que hace es mantener compilada tu sentencia SQL del lado del servidor y posteriormente solo le envías el parámetro de del ID de tu tabla detalle. Lo que alcanzo a ver de tu código es que una y otra vez se compila la sentencia SQL cada que hay un cambio en el "scroll". Otra cosa, es altamente recomendable que limites la cantidad de registros (solo manda los que el usuario esta visualizando), no tiene caso que envíes 100 si tu "grid" solo visualizas 7, ¿me explico?.

Te puedo decir que tengo una aplicación a través de internet y todo funciona de maravilla, claro que apliqué lo que explica Casimiro y los demás consejos que menciono arriba.

Saludos,
Gerardo Suárez Trejo

guillotmarc 12-01-2011 12:47:45

Además de los consejos que te han dado, yo te aconsejo que minimizes el nº de consultas lanzadas al servidor. Carga el máximo de datos posibles en local en Clientdatasets y utilizalos en lugar de volver a consultarlos al Servidor.

Por ejemplo, no necesitas lanzar consultas nuevas en cada AfterScroll. Es mucho mejor cargar todos los datos al cargar la pantalla (aunque tarde un poquito más al cargar), y después filtrar la información en local.

Así pues TaulaC es un :

select Numero, Fecha, Unidades, ...
from Albaran
where Empresa = :Empresa and Cliente = :Cliente
order by Fecha

Y TaulaCL es :

select Clave, Producto, Unidades, Importe, ...
from Lineas
inner join Albaran on Albaran.Clave = Lineas.Clave
where Lineas.Empresa = :Empresa and Albaran.Cliente = :Cliente
order by Lin_Num

Ahora cuando en el Formulario se lanze el Evento AfterScroll, en lugar de volver a consultar los datos, solo tienes que aplicar un filtro en local. Para el usuario el resultado será casi inmediato (a diferencia de lanzar otra consulta al servidor, que debido a los grandes lags de las conexiones por Internet, tendrá un retraso claramente detectable por el usuario).

TaulaCL.Filter := 'Clave = ' + Taula.FieldByName('Clave').AsString;
TaulaCL.Filtered := True;

Espero que se entienda.

Salut xiquet.

tec 12-01-2011 16:21:22

PackedRecords
 
Muy interesantes las respuestas.

He probado lo de traer solo los registros que se pueden mostrar en el dbgrid.

La velocidad mejora muchisimo, pero al poner PackedRecord=5 cuando bajo por el dbgrid con la flecha de dirección al superar el registro 3 me vuelve a empezar por el primero y luego el 5, en vez de mostrar los siguientes 5.

No entiendo ¿ porque no lo gestiona correctamente ?


La franja horaria es GMT +2. Ahora son las 02:40:20.

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