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 23-01-2008
sandiamo sandiamo is offline
Miembro
 
Registrado: mar 2007
Posts: 22
Poder: 0
sandiamo Va por buen camino
Optimizar LEFT JOIN

Hola
Les escribo porque no encuentro de mejorar el rendimiento de la siguiente consulta SQL:


Código SQL [-]
Select CURRENT_DATE AS FECHA, t.codtiendah,t.nomh,h.codor,
h.descripcion,h.codh,t.codigo,s.stock
from auxh h
 left join Articulos a
 on a.codoperador=h.codor
 inner join tiendasip t
 on t.codigo=:xcod
 left join stockarticulos s
 on (a.codigo=s.codarticulo)and(t.codigo=s.codtienda)
order by h.codorden




la cuestion es que sin realizar el ultimo left join el rendimiento es optimo pero con el se dispara el consumo de tiempo. He estado buscando otras opciones y todas me llevan a un tiempo similar.
Gracias por atenderme

Última edición por sandiamo fecha: 23-01-2008 a las 18:28:40. Razón: El texto no resalta sintaxis SQL
Responder Con Cita
  #2  
Antiguo 23-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Sin conocer cual es el motor que usas, tener una idea de las estructuras de las tablas, y del por que está diseñada la consulta de esta manera, es imposible dar una respuesta atinada.

En esto de las bases de datos, pocas cosas son absolutas.

¿es realmente necesario hacer un left join?
__________________
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 23-01-2008
sandiamo sandiamo is offline
Miembro
 
Registrado: mar 2007
Posts: 22
Poder: 0
sandiamo Va por buen camino
Hola jachguate
El motor de base de datos es Firebird, las tablas no tienen nada en especial y si que necesito utilizar el left join ya que necesito que aparezcan todos los registros de la tabla auxh aunque no esten relacionados con las otras tablas.
En realidad el problema creo que viene de ahí porque si cambio el ultimo left join por un inner join la consulta se realiza muy rapida, aunque no me da loq ue necesito
Responder Con Cita
  #4  
Antiguo 23-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
¿que es lo que necesitas?

Pregunto, porque simplemente para que aparezcan todos los registros de la tabla auxh, no me parece necesario el último left join...

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 23-01-2008
sandiamo sandiamo is offline
Miembro
 
Registrado: mar 2007
Posts: 22
Poder: 0
sandiamo Va por buen camino
Tambien pensaba eso mismo yo pero cambiandolo por un inner join hay registros que no aparecen
Responder Con Cita
  #6  
Antiguo 23-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
bien. Veo que no queres dar mas información. Lamentablemente, no traje mi varita mágica. Quizás alguien mas..

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 23-01-2008
sandiamo sandiamo is offline
Miembro
 
Registrado: mar 2007
Posts: 22
Poder: 0
sandiamo Va por buen camino
A que te refieres con mas información?? Lo unico que preguntaba es si sabiais alguna manera de optimizar la consulta, pero bueno gracias por tu tiempo.
Responder Con Cita
  #8  
Antiguo 23-01-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por sandiamo Ver Mensaje
A que te refieres con mas información?? Lo unico que preguntaba es si sabiais alguna manera de optimizar la consulta, pero bueno gracias por tu tiempo.
Creo que sin saber que quieres obtener difícilmente te podemos ayudar incluso a crear una nueva consulta, por ejemplo, veo tu código y no entiendo que deseas obtener, si nos lo expresas en "español" tal vez y digo, tal vez, tu sentencia no es adecuada y se puede solucionar de otra forma.

Ten en cuenta que no conocemos la estructura de tus tablas y así es como dar "palos de ciego".

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #9  
Antiguo 23-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cita:
Empezado por sandiamo Ver Mensaje
A que te refieres con mas información??
Bueno, ponete en mis zapatos... ¡no tengo idea de lo que querés hacer!. Vos la tenes muy clara... por eso obvias muchos detalles. Por eso te referí al hilo de la calidad de las preguntas, que no creo que hayas leido todavía.

¿que datos están almacenados en la tabla auxh?
¿que datos están almacenados en la tabla tiendasip?

Si no tenemos su estructura, al menos entender que es cada una.

Luego, ¿que índices tienen las tablas?

Finalmente, ¿que información esperas obtener de vuelta?

Esto porque quizás no haya forma de optimizar esta consulta que vos estas planteando... pero quizás se pueda plantear una consulta diferente, que devuelva la información que precisás, pero que sea mas óptima.

No se... la tarea de darse a entender no es mia... es tuya, así que si yo fuera vos, pensaría que mejor dar información de sobra y no de falta.

Es probable que en la mitad del tiempo (o menos) que he invertido para explicarte estas cosas, hubiese planteado una solución a tu problema. En cambio, voy a comer, luego a una junta... y quizás no tenga el ánimo de volver a ver el hilo, o simplemente podría morir hoy por la tarde ¿por que correrte ese riesgo si ya hubo alguien dispuesto a ayudarte?
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #10  
Antiguo 25-01-2008
sandiamo sandiamo is offline
Miembro
 
Registrado: mar 2007
Posts: 22
Poder: 0
sandiamo Va por buen camino
Ok oido cocina he leido el Tema calidad en las preguntas y estoy de acuerdo.
Siento haber sido poco claro en la pregunta.

La tabla tiendasip no es importante a mi entender en esta consulta pues solo se utiliza para recopilar un par de campos, y aun eliminandola de la consulta el retardo se mantiene.
El problema a mi entender viene porque las tablas auxh y stockarticulos no estan relacionadas directamente y se requiere de la tabla articulos como tabla intermedia. Además, es necesario que aparezcan todos los registros de la tabla auxh, aunque no aparezcan en la tabla stockarticulos (de ahí los dos left join utilizados).
No utilizo indices en las tablas por cierto.
Vamos que esta consulta seria equivalente:

Código SQL [-]
Select CURRENT_DATE AS FECHA,h.codor,
h.descripcion,h.codh,a.codigo,s.stock
from auxh h
left join articulos a
on (a.codoperador=h.codor)
left join stockarticulos s
on (s.codarticulo=a.codigo)and(s.codtienda=:xcodtienda)
order by h.codorden

Las Tablas son:
auxh
CODIGO INTEGER,
CODORDEN INTEGER,
CODOR VARCHAR(50),
DESCRIPCION VARCHAR(100),
CODH VARCHAR(25)
articulos
CODIGO INTEGER,
CODOPERADOR VARCHAR(50)
stockarticulos
CODIGO INTEGER,
CODARTICULO INTEGER,
CODTIENDA INTEGER,
STOCK DOUBLE PRECISION
Responder Con Cita
  #11  
Antiguo 25-01-2008
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
Cita:
Empezado por sandiamo
No utilizo indices en las tablas por cierto.
Pues ya los estás creando, crea indices con los campos por los cuales se enlazan las tablas y por aquellos que quieras realizar una ordenación.

Una vez hecho esto si la cosa sigue lenta tendremos que esperar que jachguate no se haya muerto el otro día por la tarde para que nos ilumine con su sabiduria .

Un saúdo.
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
  #12  
Antiguo 26-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cita:
Empezado por Ivanzinho Ver Mensaje
Pues ya los estás creando, crea indices con los campos por los cuales se enlazan las tablas y por aquellos que quieras realizar una ordenación.
No hace falta crear un índice por aquellos campos que son parte de una llave foránea, pues para estos el motor crea automáticamente uno al declarar la regla de integridad.

Cita:
Empezado por Ivanzinho Ver Mensaje
tendremos que esperar que jachguate no se haya muerto el otro día por la tarde para que nos ilumine con su sabiduria .
¡Te tengo malas noticias!.... resulta que acá en el cielo también hay conexión a Internet... parece que no se librarán de mi en el club...

Con respecto del tema del hilo, si solo se pretende que aparezcan *todos* los registros de la tabla auxh, no entiendo por qué se hacen dos left join y no solo uno.

Tampoco veo por que razón se coloca la condición (s.codtienda=:xcodtienda) como parte del join, pues a mi entender esta debiera ir en el where. Aún cuando el resultado pueda ser el mismo, la semántica es distinta.

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
  #13  
Antiguo 26-01-2008
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
Cita:
Empezado por jachguate
No hace falta crear un índice por aquellos campos que son parte de una llave foránea, pues para estos el motor crea automáticamente uno al declarar la regla de integridad.
Di por hecho que no tenía claves foráneas , para las claves primarias tampoco haría falta crearlos.

Sandiano, yo te recomendaría que mirases algo de procesamiento y optimización de consultas, para poder optimizar el diseño, y por tanto el rendimiento, de la base de datos, así como calcular el coste de dichas consultas.



Cita:
Empezado por jachguate
¡Te tengo malas noticias!.... resulta que acá en el cielo también hay conexión a Internet... parece que no se librarán de mi en el club...
No vivas engañado, eso es que estás en el infierno

Un saúdo
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
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
Left Join peripla SQL 1 28-06-2007 18:52:46
usando LEFT JOIN o RIGHT JOIN alcides SQL 8 03-05-2007 17:35:46
left join e inner join duda Patricio SQL 0 26-04-2007 22:06:43
LEFT OUTER JOIN e INNER JOIN Juntos alcides SQL 3 08-07-2005 18:06:27
LEFT JOIN extraños? Gydba Oracle 5 07-05-2004 22:11:32


La franja horaria es GMT +2. Ahora son las 09:57:25.


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