Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Optimización de consulta

Estas en el tema de Optimización de consulta en el foro de PostgreSQL en Foros del Web. Hola a todos, a ver si alguien me puede echar una mano. Tengo una consulta sobre una base de datos que la lanzo y es ...
  #1 (permalink)  
Antiguo 12/06/2009, 01:42
 
Fecha de Ingreso: febrero-2008
Mensajes: 20
Antigüedad: 16 años, 2 meses
Puntos: 1
Pregunta Optimización de consulta

Hola a todos, a ver si alguien me puede echar una mano. Tengo una consulta sobre una base de datos que la lanzo y es eterna, no termina de ejecutarse, la he dejado cargando hasta 10 minutos y nada...

La consulta es la siguiente:

Código:
SELECT DISTINCT c.id AS id_candidato, c.nombre, c.apellido1, c.apellido2
FROM candidatos c  JOIN usuario u ON c.id_user = u.id
WHERE u.estado = 1 AND u.id_tipo = 1 AND c.id NOT IN ( SELECT cvi.id_candidato
FROM cv_idiomas cvi );
En la tabla candidatos hay sobre 35000 registros
En la tabla usuario tb sobre 35000
y en la tabla cv_idiomas hay sobre 50000

A ver si alguien me puede echar una mano.

Muchas gracias.

Un saludo.
  #2 (permalink)  
Antiguo 12/06/2009, 07:22
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Optimización de consulta

Cita:
y en la tabla cv_idiomas hay sobre 50000
aca radica la excesiva demora.

Con lo que estas haciendo, asumo que la tabla cv_idiomas y candidatos están relacionadas por el id.

Prueba esta:
Código sql:
Ver original
  1. SELECT DISTINCT c.id, c.nombre, c.apellido1, c.apellido2
  2. FROM candidatos c  JOIN usuario u ON c.id_user = u.id
  3. JOIN cv_idiomas cv ON cvi.id_candidato != c.id
  4. WHERE u.estado = 1 AND u.id_tipo = 1;

No la he probado.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 12/06/2009 a las 09:21
  #3 (permalink)  
Antiguo 15/06/2009, 09:06
 
Fecha de Ingreso: febrero-2008
Mensajes: 20
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: Optimización de consulta

Hola Huesos, muchas gracias por tu interés ... lamentablemente esa sentencia no resuelve lo que se desea obtener... en realidad no me queda muy claro lo que está haciendo tu consulta exactamente ya que me saca todos los candidatos estén o no en la tabla cv_idiomas...

Te explico, mi sentencia lo que hace, y deseo obtener, es que me saca todos los candidatos que no tienen ningún registro en la tabla cv_idiomas, vamos, más concretamente que candidatos no han introducido ningún idioma.

En local me responde rápido ya que tengo solo 10 candidatos de los cuales 8 no han introducido idiomas y son estos los que me muestra, tu consulta me devuelve los 10 candidatos.

Insisto, gracias por tu colaboración.

A ver si otra persona me puede ayudar. Gracias.
  #4 (permalink)  
Antiguo 15/06/2009, 12:42
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Optimización de consulta

Código sql:
Ver original
  1. SELECT DISTINCT c.id AS id_candidato, c.nombre, c.apellido1, c.apellido2
  2. FROM candidatos c  JOIN usuario u ON c.id_user = u.id
  3. WHERE u.estado = 1 AND u.id_tipo = 1
  4. EXCEPT
  5. SELECT cvi.id_candidato,c1.nombre, c1.apellido1, c1.apellido2
  6. FROM cv_idiomas cvi INNER JOIN candidatos c1
  7. ON cvi.id_candidato=c.id;

espero esta si te sirva. la probé y parece funcionar.
Es mucho mas optimo usar la clausula except que not in.

Pruebala y nos cuentas.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:33.