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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

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