Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-05-2007
aprendiz2 aprendiz2 is offline
Miembro
 
Registrado: dic 2006
Posts: 70
Poder: 18
aprendiz2 Va por buen camino
SQL se pone lento

Hola otra vez ! Quizas alguien puediese enseñarme cual es la forma correcta de expresar una pregunta en SQL, para lograr buena velocidad de respuesta.

Problema a resolver: Mejorar la velocidad de respuesta.

( He probado de muchas formas, pero no logro la velocidad, y pienso que la respuesta deberia ser instantanea...pero no se como se hace )

Tablas tipo Paradox, Delphi 5, en red.

Para asociarlo con la realidad, asumir que tenemos 3 tablas

Cita:
Productos
Encabezados ( Encabezado de una factura, digamos )
Detalles ( detalles de las facturas, relacion con Encab y Prod. )

- Productos se relaciona con Detalles, a traves de "CodigoProducto"
- Encabezado se relaciona con Detalles, a traves de "Consecutivo".
( no describire todos los campos, es solo un ejemplo sencillo ).


Cita:
Descrito en palabras, se trata de obtener lo siguiente:

Para un producto X,
obtener todos los Detalles que le corresponden,
añadiendo como limitante un rango de fechas ( Fecha esta en Encabezado )
Código SQL [-]
Select  Detalles.CampoX,
          Encabezados.CampoY,
          Productos.CampoZ
 
from    Detalles, Encabezados, Productos
 
where  (Detalles.CodigoProducto = :xCodigoProducto) and
          (Productos.CodigoProducto = Detalles.CodigoProducto) and
          (Detalles.Consecutivo = Encabezado.Consecutivo) and
          (Encabezado.Fecha between :FechaDesde and :FechaHasta)

Asumir que hay indices en todos los campos que relacionan las tablas, inclusive en Fecha

Quien provoca la lentitud, es la condicion del rango de fechas. ( al quitar esta condicion, se nota una buena diferencia en el tiempo de respuesta ).

Cual seria la mejor forma de expresar la pregunta en SQL? Me he cansado de probar diferentes formas, pero no logro la respuesta "instantanea" que deseo.

La unica forma que he encontrado de hacerlo "instantaneo", es descartar el SQL por completo, enlazar Productos y Detalles en Master / Detail, poniendo el rango de fechas como un filtro dentro del Detail, con un poquito de programacion, para buscar el registro que corresponde en el Encabezado.

Quisiera aprender a usar bien el SQL, para sacarle el mayor provecho posible, y pienso que algo estoy haciendo mal, porque no logro la velocidad.

Muy agradecido !

Última edición por aprendiz2 fecha: 26-05-2007 a las 01:12:14.
Responder Con Cita
  #2  
Antiguo 26-05-2007
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Esta es una pregunta interesante... pero no tiene una única respuesta, pues:
  • Lo que en un motor resulte en una respuesta mas rápida, en otro puede resultar en una respuesta mas lenta
  • No es solo la forma de plantear el SQL la que afecta, también otros "objetos" de la base de datos, tales como índices, particiones, etc.
  • También afecta la configuración del sistema operativo y los parámetros de configuración del motor de base de datos (si los hay)

Por ello, hay que tratar cada caso en particular.

Te recomiendo que leas la documentación del motor que estas usando, pues allí vas a encontrar las diferentes respuestas a tus preguntas.

Por otro lado, si el motor lo soporta, es mejor escribir la sentencia expresada en forma de joins (inner, outer), pues resulta mas fácil de entender, no para el motor, sino para el humano... y eso es algo que vos mismo vas a agradecer en el futuro.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 26-05-2007
aprendiz2 aprendiz2 is offline
Miembro
 
Registrado: dic 2006
Posts: 70
Poder: 18
aprendiz2 Va por buen camino
Gracias !

Gracias por las recomendaciones Jachguate,

El "motor" que uso es el que viene con Delphi 5, ( se llama Local SQL, segun entiendo ).

Hasta donde he podido, he leido y probado, pero no veo diferencia ni mejoria.
Pero tambien se que mis conocimientos del tema son pocos !

Esto es lo que he probado:

- Probe los JOIN, pero se me puso un poco mas lento,

- Probe cambiar el Between a expresion con >=, <=, dio lo mismo.

- Probe sustituir el Between con un IN y otro sub-query ahi metido,(no me salio nada bueno de eso ).

- Probe cambiar el orden de las condiciones ( uno nunca sabe !, quizas dandole una pista a donde ir primero, le ayude !. jaja ),

- Probe usar el DataSource con Productos, en vez de mandarle el xCodigoProducto manualmente. ( idem ).

- Probe apagar y encender la PC varias veces... ! sin diferencia ( uno nunca sabe ! jaja ! ).

...y hasta ahi he podido llegar... no se que mas probar. Le he dado la vuelta a la ayuda que se llama "Local SQL", y seguro se me escapa algun(os) detalles, con los cuales sucederia la "magia" de la velocidad.

( partir el Select en 2 Select diferentes lo hace mas rapido, pero pierde gracia el asunto, y gana oscuridad ).

Todavia pienso que ha de existir una mejor forma, ya que comparandolo con la forma "manual" de buscar los datos, hay muchisima diferencia.

Ojala exista esa forma mejor, porque tantas cosas buenas leo acerca del SQL, y yo siempre acabo haciendo las cosas con el while, findkey, etc. porque cuando trato de envolver 3 o mas tablas con condiciones algo complejas, el SQL se me pone lento. ( y a veces hasta me frustro con las tablas, porque las siento lentas, y regreso a hacerlo todo con blockread / blockwrite al estilo antiguo...! ).

Con una tabla o dos, el SQL me funciona muy bien, siempre y cuando las condiciones sean sencillas. ( las de amarre, basicamente ).

En fin, siento que me falta muchisimo por aprender, porque tantas personas usan el SQL ( asumo que exitosamente ) y yo no lo puedo echar a andar como se debe ! ( funciona, pero muy lento en preguntas un poco complejas)

Saludos !!

Última edición por aprendiz2 fecha: 26-05-2007 a las 02:44:21.
Responder Con Cita
  #4  
Antiguo 26-05-2007
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Debe tratarse de paradox, que por lo que entiendo, no es un "motor de base de datos" como tal... mas bien son archivos planos y un interprete de SQL embebido en tu propia aplicación. Dado que es algo que no use mas que un par de veces y muy por encima, no puedo aportar mas.

¿Te has planteado la posibilidad de usar un motor de base de datos como tal, es decir, un proceso externo a tu aplicación?, con lo que además de modularidad ganas en temas como multiusuario, etc.

Yo te recomiendo firebird, que a mi me ha dado muy buenos resultados.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 26-05-2007
aprendiz2 aprendiz2 is offline
Miembro
 
Registrado: dic 2006
Posts: 70
Poder: 18
aprendiz2 Va por buen camino
Habria que probar

Habria que probar el Firebird para comparar los resultados.

Como obtengo el Firebird para hacer unas pruebas ? Imagino se necesita instalar paquete(s) con objetos "data-aware" para especializados para el FBird, asi como el motor del Firebird.

Funcionaria todo con el Delphi 5?

Gracias !!!! Buen dia !!
Responder Con Cita
  #6  
Antiguo 29-05-2007
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Firebird lo conseguís en firebird en sourceforge.net

Descargá la versión para win32, realizá la instalación por defecto y listo.

Sobre los componentes de acceso, podes usar ibx (Interbase Express) que viene con delphi (al menos desde delphi 7), o el propio BDE (que ya es obsoleto).

Además, hay otros proyectos de componentes de acceso a FB. Entre ellos MDO e IBObjects. Seguro que san google te lleva directo a ellos.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 29-05-2007
aprendiz2 aprendiz2 is offline
Miembro
 
Registrado: dic 2006
Posts: 70
Poder: 18
aprendiz2 Va por buen camino
muy agradecido !

Muchisimas gracias por su ayuda !!!

Le deseo lo mejor !
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
Me ayudan con skincrafter (pone skin a nuestra aplicación) shoker4 Gráficos 10 16-08-2007 10:43:05
Novell pone fin a su distribución desktop "Suse Linux" y anuncia 600 despidos Sasuke_Cub Noticias 3 23-11-2005 06:58:17
Calendario. fecha de noviembre 2005 me pone 31 dias y a diciembre 30 sakuragi PHP 2 21-11-2005 18:39:59
Cuando imprimen en excel o word se pone lento el sistema tulio Varios 0 07-04-2004 14:56:37
Tipografias en TWebBrowser, ¿pone las que se le ocurre? Adrix Internet 0 09-09-2003 00:05:18


La franja horaria es GMT +2. Ahora son las 03:45:11.


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