Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-12-2008
cmm07 cmm07 is offline
Miembro
 
Registrado: nov 2007
Posts: 526
Poder: 17
cmm07 Va por buen camino
Post 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) , 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í ?, es que necesito urgente esto y que sea un proceso rápido..

gracias. espero sus respuestas ..

54LUDOS
Responder Con Cita
  #2  
Antiguo 23-12-2008
Avatar de Kipow
Kipow Kipow is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guatemala
Posts: 329
Poder: 19
Kipow Va por buen camino
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;
Responder Con Cita
  #3  
Antiguo 23-12-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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
__________________
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 24-12-2008
cmm07 cmm07 is offline
Miembro
 
Registrado: nov 2007
Posts: 526
Poder: 17
cmm07 Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 24-12-2008
Avatar de PepeLolo
PepeLolo PepeLolo is offline
Miembro
 
Registrado: jun 2003
Ubicación: Fuenlabrada - Madrid - Espagna
Posts: 265
Poder: 21
PepeLolo Va por buen camino
Cita:
Empezado por cmm07 Ver Mensaje
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;
__________________
PepeLolo
El hombre el único virus que mide más de unas cuantas micras
Responder Con Cita
  #6  
Antiguo 24-12-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 24-12-2008
cmm07 cmm07 is offline
Miembro
 
Registrado: nov 2007
Posts: 526
Poder: 17
cmm07 Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 24-12-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por cmm07 Ver Mensaje
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #9  
Antiguo 24-12-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Sé que lo que voy a decir tiene muchos detalles, así que no lo tomes como una "regla dicha por dios" .

Una consulta con 5.000 registros, pasarla a un Stringlist tardaba 5 segundos, al usar EnableControls pasó a durar 46 milisegundos . 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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #10  
Antiguo 24-12-2008
cmm07 cmm07 is offline
Miembro
 
Registrado: nov 2007
Posts: 526
Poder: 17
cmm07 Va por buen camino
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........
Responder Con Cita
Respuesta



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
PL/SQL - Stored proc y Cursor Paulao Varios 2 29-05-2008 17:37:15
Procedure en Firebird lento o IbQuery lento capo979 Firebird e Interbase 14 17-07-2007 21:35:36
stored proc ADO scooterjgm Conexión con bases de datos 1 09-09-2004 18:03:55
Conexión a DB con Proc. Almacenados crasv Firebird e Interbase 9 15-02-2004 19:00:16
Conexión a DB con Proc. Almacenadosdo crasv Conexión con bases de datos 1 06-02-2004 10:00:19


La franja horaria es GMT +2. Ahora son las 10:12:35.


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