Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   SQL se pone lento (https://www.clubdelphi.com/foros/showthread.php?t=44016)

aprendiz2 26-05-2007 00:34:37

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 !

jachguate 26-05-2007 00:55:18

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.

;)

aprendiz2 26-05-2007 02:41:32

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 !!

jachguate 26-05-2007 03:06:45

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.

;)

aprendiz2 26-05-2007 13:18:27

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 !!

jachguate 29-05-2007 00:03:18

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.

;)

aprendiz2 29-05-2007 06:22:51

muy agradecido !
 
Muchisimas gracias por su ayuda !!!

Le deseo lo mejor !


La franja horaria es GMT +2. Ahora son las 22:03:17.

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