Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ayuda sql proc.lento (https://www.clubdelphi.com/foros/showthread.php?t=62437)

cmm07 23-12-2008 18:24:33

ayuda sql proc.lento
 
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:

Código Delphi [-]
var
I:Integer;
begin
I:= 0;
try
  while (ido 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 :)

Código Delphi [-]
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:
Código Delphi [-]
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

Cita:

Empezado por cmm07 (Mensaje 332014)
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

Cita:

Empezado por cmm07 (Mensaje 332103)
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........


La franja horaria es GMT +2. Ahora son las 00:50:22.

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