Skip site navigation (1) Skip section navigation (2)

Metodo mas rapido que Join ???

From: Gabriel Hermes Colina Zambra <hermeszambra(at)yahoo(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Metodo mas rapido que Join ???
Date: 2007-12-21 03:01:07
Message-ID: 817875.21982.qm@web63702.mail.re1.yahoo.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Pongo dos consultas que devuelven los mismos
resultados como ejemplo, para que alguien me diga por
que un metodo es mas rapido que el otro en PostgreSQL,
incluso algunas consultas con join que son muy
demoronas en PostgreSQL y en MsAccess o SqlServer
tienen rendimiento aceptable, planteadas con where en
PostgreSQL alcanzan una diferencia notoria a favor de
PostgreSQL, que a veces no resuelve los join y los
hace eternos, estoy trabajando hasta la version 8.2.4

Con Join

select realizo_empleado.id_trabajo,
realizo_empleado.id_empleado, empleado.nombre,
realizo_empleado.superviso,
trabajos_realizados.id_empresa
from track.empleado inner join
(track.trabajos_realizados inner join
track.realizo_empleado on
trabajos_realizados.id_trabajo =
realizo_empleado.id_trabajo) on empleado.id_empleado =
realizo_empleado.id_empleado;

Con where

select realizo_empleado.id_trabajo,
realizo_empleado.id_empleado, empleado.nombre,
realizo_empleado.superviso,
trabajos_realizados.id_empresa
from
track.empleado,track.trabajos_realizados,track.realizo_empleado
where trabajos_realizados.id_trabajo =
realizo_empleado.id_trabajo and
 empleado.id_empleado = realizo_empleado.id_empleado;

En este caso son 55000 registros y los trae rapido.

Pero en este otro caso del cual la muestra la tomo de
access por que la adaptacion a postgresql la cambie el
Join no termina de realizarse

SELECT cTrabajos.ID_TRABAJO, cTrabajos.ID_CLIENTE,
cTrabajos.ID_LOCAL, cTrabajos.ID_SECTOR,
cTrabajos.ID_CATEGORIA, cTrabajos.ID_SERVICIOS,
cTrabajos.FECHA
FROM cTrabajos INNER JOIN cSituacion03 ON
(cTrabajos.ID_CLIENTE = cSituacion03.ID_CLIENTE) AND
(cTrabajos.ID_LOCAL = cSituacion03.ID_LOCAL) AND
(cTrabajos.ID_SECTOR = cSituacion03.ID_SECTOR)
WHERE (cTrabajos.FECHA)>[cSituacion03].[ULTIMO] OR 
((((cTrabajos.FECHA)=[cSituacion03].[ULTIMO])  AND
((cTrabajos.ID_TRABAJO)>=[cSituacion03].[ID_TRABAJO])));

El cambio que hice obteniendo los mismos resultados
pero con una velocidad excelente para PostgreSQL
es
 SELECT realizo_empleado.id_trabajo,
realizo_empleado.id_empleado,
    empleado.nombre, realizo_empleado.superviso,
trabajos_realizados.id_empresa
FROM track.empleado, track.trabajos_realizados,
track.realizo_empleado
WHERE ((trabajos_realizados.id_trabajo =
realizo_empleado.id_trabajo) AND
    (empleado.id_empleado =
realizo_empleado.id_empleado));

No me molesta hacerlo asi, pero en los sistemas
anteriores voy a tener que reformularme varias
consultas para optimizar tiempos de respuesta y queria
saber cual es el porque de esta situacion.


Atte.
Gabriel Colina




      ____________________________________________________________________________________
¡Capacidad ilimitada de almacenamiento en tu correo!
No te preocupes más por el espacio de tu cuenta con Correo Yahoo!:                      
http://correo.espanol.yahoo.com/

Responses

pgsql-es-ayuda by date

Next:From: Pablo BraulioDate: 2007-12-21 10:19:36
Subject: Comprobar si un campo tiene datos antes de insertar datos en otro.
Previous:From: Pablo BraulioDate: 2007-12-20 20:03:51
Subject: Re: ¿No es posible que una función ejecutada por un trigger devuelva un valor?.

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group