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 20-03-2004
Walter Walter is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 13
Poder: 0
Walter Va por buen camino
Como son evaluadas las sentencias sql

Hola me gustaría que alguien me comente como funcionan las sentencias SQL
trabajo con Paradox y Delphi 5 estando las tablas en el servidor.

El archivo Bene.db tiene 262 registros con solo 2 campos
El archivo Clientes.db tiene 6000 registros y alrededor de 100 campos
El archivo Benellama.db tiene 2 registros y 8 campos.
Los 3 archivos tienen un campo llamado idcliente que es el que uso para los joins, con la relacion 1 a 1 entre Bene y clientes y 1 a muchos entre esos y Benellama.

Como resultado de la consulta necesito ver todos los registros del arch. Bene.db con los correspondientes datos que tengo guardados en el arch Clientes.db. Como la consulta tardaba bastante empece a cambiar el armado de la instrucción y las fui probando el Sql Explorer con el siguiente resultado.
1)
select * from bene.db b
left outer join clientes.db c on b.idcliente =c.idcliente
Tardo +-20 segundos. Me muestra 262 registros con todos sus datos.

2)
select * from clientes.db c
right outer join bene.db b on b.idcliente =c.idcliente

Tardo +-20 segundos. Me muestra 262 registros con todos sus datos.


3) decidi agregarle el arch benellama.db , usando un select distinct para eliminar los duplicados.

select distinct(idcliente), ape, domi, loca,pro from bene.db b
left outer join benellama.db d on d.idcliente=b.idcliente
left outer join clientes.db c on c.idcliente=b.idcliente

Tardo “+- 5 segundos”. Me muestra 262 registros con todos sus datos.

4) Por ultimo probé con:

select * from bene.db b
left outer join bene.db x on x.idcliente=b.idcliente
left outer join clientes.db c on c.idcliente=b.idcliente

Tardo “+- 5 segundos”. Me muestra 262 registros con todos sus datos y es similar a la 1 consulta.

Gracias de Antemano.
PD: Puede ocasionar algún problema trabajar con esta última consulta?
Responder Con Cita
  #2  
Antiguo 21-03-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Con que no se exactamente que es lo que quieres que te expliquen, sólo decirte que, tablas en las que la relación es 1 a 1, se suelen fundir en una sola tabla. De esta manera te evitas hacer joins innecesarios.

Por otro lado.... has probado a hacer inner joins en lugar de left/rigth outer joins? Más que nada para ver que resultado obtienes a nivel de tiempos
Responder Con Cita
  #3  
Antiguo 21-03-2004
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
Con los pocos datos que tienes en esas tablas los resultados de
esas sentencias SQL deberian ser inmediatos (unas centesimas de segundo como mucho), da la impresion de que no hayas definido indices para los campos.

Saludos
Miguel
Responder Con Cita
  #4  
Antiguo 22-03-2004
Walter Walter is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 13
Poder: 0
Walter Va por buen camino
Gracias a Cadetill y Mick por responderme.
Probe:
select * from clientes.db c
inner join bene.db x on x.idcliente=c.idcliente
Tiempo +- 20 segundos

select * from bene.db b, clientes.db c
where b.idcliente=c.idcliente
Tiempo +- 20 segundos.

Cuando digo como funciona SQL quiero decir como son evaluadas las sentencias (si empieza por la tabla de la izq. hacia la derecha ,de la der. A la izq, si evalúa primero las tablas que tienen cláusulas “where”, o por donde empieza cuando hay mas de dos tablas. Con respecto al tiempo no se si 5 segundos es mucho y 20 son una eternidad, también hay que tener en cuenta que las tablas no las tengo en mi disco rígido, sino que están en el disco del servidor con la red de por medio. En ambas tablas tengo un índice primario en el campo idcliente.


Cadetill mira estas dos sentencias:

A)
select * from bene.db b
left outer join bene.db x on x.idcliente=b.idcliente
left outer join clientes.db c on c.idcliente =b.idcliente

Tarda +- “5” segundos.

B)
select * from bene.db b
left outer join clientes.db c on c.idcliente =b.idcliente

Tarda +- “20” segundos.

Cuando repito la tabla bene por 2º vez en el join de la consulta “A”, la consulta tarda 15 segundos menos, es lo que me llama poderosamente la atención, cuando lo lógico seria usar la sentencia “B”.
Responder Con Cita
  #5  
Antiguo 22-03-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Usando la misma tabla, la verdad es que no tiene mucho sentido esta diferencia en el tiempo, todo al contrario, creo que tendría que tardar más ya que ha de hacer una unión (que por otro lado será rápida, pero no para rebajar tiempo)

Si fuese como en el primer mensaje, es decir, que unes 3 tablas, sí que podría ser, ya que una de las uniones puede devolver pocos registros y, así, acelerar la segunda unión.

Según tengo entendido, las uniones entre tablas se hacen de fuera hacia dentro, es decir, primero evalua la primera join, luego la segunda,..... pero ya digo, la valuación de la join cuesta un tiempo (aunque sean milisegundos) por lo que no tiene mucho sentido que reste

A ver si alguien con más experiencia que yo en el Local SQL (que es el que hace servir Paradox) nos puede informar algo más al respecto
Responder Con Cita
  #6  
Antiguo 23-03-2004
Avatar de haron
haron haron is offline
Miembro
 
Registrado: may 2003
Ubicación: Las Palmas de Gran Canaria
Posts: 310
Poder: 22
haron Va por buen camino
no se cuan rapido es Paradox, pero revisa si las tablas tienen definidos indices en el campo idcliente y si tienen clave primaria. esto es muy importante para que las consultas se ejecuten rapidamente.

ten en cuenta que la capacidad de la red influye en el tiempo de respuesta. vuelve a ejecutar las consultas pero de esta forma:

selec null
from ...

esta consulta solo devuelve un registro nulo. asi consigues que el tiempo de respuesta no este influenciado por la red.
__________________
“Plantad la semilla de la avaricia en la infértil tierra de la estupidez y obtendreis la bella flor de la mierda”
(Confucio)
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


La franja horaria es GMT +2. Ahora son las 14:55:43.


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