Ver Mensaje Individual
  #4 (permalink)  
Antiguo 27/10/2010, 08:14
refreegrata
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 16 años, 5 meses
Puntos: 27
Respuesta: duda con joins(¿cual de estas consultas es mejor?)

Mis consultas son algo así:

opcion 1:

Código PHP:
SELECT ingresodetalle.*, producto.*, unidad.valordecimal FROM producto
INNER JOIN ingresodetalle ON 
(
         
ingresodetalle.codigo_ingreso=1608 AND
         
EXISTS (SELECT ordencompradetalle.codigo FROM ordencompradetalle
                      WHERE ordencompradetalle
.codigo_orden=1715 AND
                      
ordencompradetalle.codigo=ingresodetalle.ordencompradetalle) AND
         
ingresodetalle.codigo_producto producto.codigo )
INNER JOIN unidad ON unidad.detalle=producto.unidad )
WHERE producto.codigo_maestroproducto=2 ORDER BY ingresodetalle.codigo 
y la opcion 2:

Código PHP:
SELECT ingresodetalle.*, producto.*, unidad.valordecimal FROM producto
INNER JOIN ingresodetalle ON 
(  ingresodetalle.codigo_producto producto.codigo )
INNER JOIN unidad ON unidad.detalle=producto.unidad )
WHERE producto.codigo_maestroproducto=AND
            
ingresodetalle.codigo_ingreso=1608 AND
            
EXISTS (SELECT ordencompradetalle.codigo FROM ordencompradetalle
                         WHERE ordencompradetalle
.codigo_orden=1715 AND
                 
ordencompradetalle.codigo=ingresodetalle.ordencompradetalle)
ORDER BY ingresodetalle.codigo 

el explain:

"Sort (cost=195.86..195.87 rows=2 width=187)"
" Sort Key: ingresodetalle.codigo"
" -> Nested Loop (cost=162.13..195.85 rows=2 width=187)"
" -> Nested Loop (cost=162.13..195.28 rows=2 width=186)"
" -> Nested Loop (cost=162.13..178.71 rows=2 width=69)"
" -> Unique (cost=162.13..162.14 rows=2 width=8)"
" -> Sort (cost=162.13..162.14 rows=2 width=8)"
" Sort Key: ordencompradetalle.codigo"
" -> Seq Scan on ordencompradetalle (cost=0.00..162.12 rows=2 width=8)"
" Filter: (codigo_orden = 1715)"
" -> Index Scan using fki_tiene_or_in on ingresodetalle (cost=0.00..8.27 rows=1 width=69)"
" Index Cond: (ingresodetalle.ordencompradetalle = ordencompradetalle.codigo)"
" Filter: (ingresodetalle.codigo_ingreso = 1608)"
" -> Index Scan using producto_pkey on producto (cost=0.00..8.27 rows=1 width=117)"
" Index Cond: (producto.codigo = ingresodetalle.codigo_producto)"
" Filter: (producto.codigo_maestroproducto = 2)"
" -> Index Scan using unidad_pkey on unidad (cost=0.00..0.28 rows=1 width=12)"
" Index Cond: (unidad.detalle = producto.unidad)"


El "explain" Es exactamente el mismo para ambas consultas, y como se ven iguales es que me asalta la duda acerca de que es en términos generales lo mejor.

Quizás mi comprensión de lectura no es de las mejores, pero me parece que sus opiniones están un poco contrapuestas.

Realmente la duda se me produce porque en la actualidad desplegar una página web en donde se hace uso de esta consulta paso de demorar en desplegarse de unos 4 segundos a unos 18 segundos. Tampoco es que sea una demora excesiva, ni que sea inutilizable esa sección, si no que simplemente me despertó curiosidad.

Saludos.

P.D.1: Uso postgresql 8.4
P.D.2: La razón del tiempo que se toma en desplegar la página es debido a la consulta, a pesar de que la tabla no ha crecido demasiado.
P.D.3: el servidor parece estar configurado de acuerdo a lo recomendado.