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/
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?. |