PDA

Ver la Versión Completa : ayuda sql proc.lento


cmm07
23-12-2008, 18:24:33
Hola, me conecto a SQL 2005 Express en dlphi 2009, funciona todo bien, se ven los registros y va todo muy rapido, tengo aprox. 10000 registros en la tabla "EJEMPLOS", y tiene un unico campo llamado "NOMBRE", y lo que quiero es que en un Memo o RichEdit me haga un listado de los 10000 registros osea recorrer la tabla una por una y anotar el nombre en un memo, lo hago asi:

var
I:Integer;
begin
I:= 0;
try
while (i<AdoQuery1.RecordCount) do begin

I:= I+1;
Memo1.Lines.Add(Trim(AdoQuery1['Nombre']));
AdoQuery1.Next;
end;

finally
AdoQuery1.Active:=False;
AdoQuery1.Active:=True;
end;


Pero el unico problema es que este proceso es muy lento se demora varios segundos (Como 20 o 25 seg. y para mi eso es demasiado) :rolleyes:, la verdad mi duda es si existe alguna forma de que sea más rápido el proceso, que se pueda hacer esto mismo pero con secuencia SQL o una intrucción más optimizada o algo así ?:confused:, es que necesito urgente esto y que sea un proceso rápido..

gracias. espero sus respuestas ;)..

54LUDOS

Kipow
23-12-2008, 20:07:13
No es lo mas facil dejarlos en el AdoQuery y procesarlos 1 a 1 me imagino que vas a generar los codigos de barras de cada uno? porque no los generas al vuelo?

sugerencia :)

begin
try
AdoQuery1.Active := true;
while (not AdoQuery1.EOF) do begin
Memo1.Lines.Add(Trim(AdoQuery1['Nombre']));
AdoQuery1.Next;
end;

finally
AdoQuery1.Active:=False;
AdoQuery1.Active:=True;
end;

Lepe
23-12-2008, 20:29:28
esto debería ser rápido, milisegundos, a más tardar 1.5 segundos:

try
AdoQuery1.Active := true;
AdoQuery1.DisableControls;
while (not AdoQuery1.EOF) do begin
Memo1.Lines.Add(Trim(AdoQuery1['Nombre']));
AdoQuery1.Next;
end;

finally
AdoQuery1.EnableControls;
AdoQuery1.Active:=False;
end;

Si es lento, pon tu SQL y dinos los índices que tienes creados en la tabla, así como clave primaria

Saludos

cmm07
24-12-2008, 00:41:47
no puedo probar el código ya que desintale el SQL 2005 y estoy instalando SQL2008, acerca de la instrucción yo no me refiero a nada con lo de los codigos de barra, es mas no se de donde sacaste eso, pero bueno, la intención está, pero lamentablemente no deseo código delphi, ya que el proceso es muy lento con 10000 registros, pero estoy por decifrar mi problema, cuando lo solucione se los muestro y ven a lo que me refiero

PepeLolo
24-12-2008, 01:47:36
Hola, me conecto a SQL 2005 Express en dlphi 2009, funciona todo bien, se ven los registros y va todo muy rapido, tengo aprox. 10000 registros en la tabla "EJEMPLOS", y tiene un unico campo llamado "NOMBRE", y lo que quiero es que en un Memo o RichEdit me haga un listado de los 10000 registros osea recorrer la tabla una por una y anotar el nombre en un memo

Perdona pero lo que haces no tiene ningún sentido a excepción de que vengas de programación en VB o alguno parecido y no sepas como resolver la encrucijada en la que te encuentas. Simplemente necesitas un DBGrid conectarlo a un DataSource y este a tú DataSet "AdoQuery1". Lo que quieres resuelto y sin escribir una línea de código, bueno una solo AdoQuery1.Open;

Delphius
24-12-2008, 02:16:38
Hola cmm07,
El procedimiento debería ser rápido. Y lo mejor es emplear Disable y EnableControls para acelerar la carga y evitarse el parpadeo de cuando se van llenando o mostrando los registros.

El problema muy posiblemente no lo tengo el motor. No creo que solucione nada con desinstalarlo e instalar otro de mayor versión.
Sólo quiero hacerte éstas preguntas:
1. ¿Estás lanzando la consulta para extraer y mostrar esos 10000 registros al usuario? Cuando más registros puedas filtrar mejor será.
2. ¿Tienes definidos índices? Los índices pueden acelerar muchísimo el trabajo.
3. Por lo que entiendo empleas ADO. ¿Jet ó ODBC? Por lo general a través de ODBC suele ser más lento.
4. ¿Es local o remoto?¿red interna? Si está en una red hay otras cosas más para analizar...

En fin, como te digo: no creo que sea culpa del motor ni de Delphi.
Si nos puedes comentar más al respecto, te podríamos ser de ayuda.

Saludos,

cmm07
24-12-2008, 03:05:05
hola respecto a PepeLolo, no deseo simplemete conectar a una bd, ya me lo se de memoria como conectar en ADO, dbExpress, Zeos y muchos otros, el problema es un poco más complejo, pero como dije ya está casi solucionado, respecto a Delphius, al instalar una sql mayor no pretendo que me solucione nada, sino deseo trabajar con la ultima version y no con la 2005, Respuestas:
1.- no se los quiero mostrar al usuario quiero crear un asistente completo de SQL y necesito hacer este procedimiento.
2.- la verdad no
3.- trabajo con ODBC, me decidí por que ASP.Net trabaja con este y está muy rápido y estable(mi opinion).
4.- Es local, depués deseo migrarlo remotamente...

54LU2

Delphius
24-12-2008, 04:25:59
respecto a Delphius, al instalar una sql mayor no pretendo que me solucione nada, sino deseo trabajar con la ultima version y no con la 2005, Respuestas:
1.- no se los quiero mostrar al usuario quiero crear un asistente completo de SQL y necesito hacer este procedimiento.
2.- la verdad no
3.- trabajo con ODBC, me decidí por que ASP.Net trabaja con este y está muy rápido y estable(mi opinion).
4.- Es local, depués deseo migrarlo remotamente...

54LU2
Bueno allí mismo tienes parte de la solución: ¡crea los índices! Creeme que éstos harán más rápido la consulta.
Por el punto 3... No quiero sonar atrevido pero... ¿que tiene que ver ASP.Net con Delphi?

No es por nada pero por lo general, a través de ODBC es más lento que cualquier otro medio de acceso. Mediante ODBC estás añadiendo otra capa más entre tu aplicativo y la base de datos.

Saludos,

Lepe
24-12-2008, 07:19:33
Sé que lo que voy a decir tiene muchos detalles, así que no lo tomes como una "regla dicha por dios" :D.

Una consulta con 5.000 registros, pasarla a un Stringlist tardaba 5 segundos, al usar EnableControls pasó a durar 46 milisegundos :eek:. Por supuesto teniendo clave primaria.

Si tienes el doble de registros, ya tienes 10 segundos; le sumas el no tener clave primaria ni índices, ahí tienes tus 25 segundos... fijo.

Saludos

cmm07
24-12-2008, 15:25:56
jaja gracias, gracias a todos ustedes, pense que como ADO trabaja con ASP.NET podría ser bueno ocupar esta tecnologia en delphi, pues tienes razón, hay que crear indices para que acelere la consulta, muchas gracias a todos ustedes........