2014-01-05 3 views
0

쿼리에 IN 절이있는 SQL 쿼리를 조정하려고합니다.SQL 쿼리 튜닝 (쿼리 최적화)

IN을 Join으로 바꾸고 쿼리 계획을 살펴 보았습니다. 실행 시간은 비슷하지만 결과는 different.Can 누군가가 관련하여 도움이 될 수 있습니까? pgadmin III에서 상점 데이터베이스를 사용하고 있습니다. 미리 감사드립니다. 원래 쿼리 :

SELECT person.id 
FROM SHOP.person 
WHERE person.id IN (SELECT personid 
        FROM SHOP.contactperson 
        WHERE companyid = 5); 

편집을 할

SELECT person.id 
FROM SHOP.person 
     JOIN SHOP.contactperson 
     ON person.id = contactperson.id 
WHERE contactperson.companyid = 5; 

에 지금이 쿼리 반환 올바른 결과 :

SELECT person.id 
FROM SHOP.person 
     JOIN SHOP.contactperson 
     ON person.id = contactperson.personid 
WHERE contactperson.companyid = 5; 

나는 내가 그것을 변경할 때 대신 contactperson.idcontactperson.id을 사용하고 있었다 올바른 쿼리를 내게 올바른 결과를 준.

+2

성능 튜닝은 ** 높은 벤더 고유의 **입니다. SQL은 쿼리 언어 일뿐입니다. 대다수의 관계형 데이터베이스 시스템에서 사용합니다 ..... –

+0

@marc_s는 상점 데이터베이스이며, pgadmin III에서 사용하고 있습니다. –

+1

인덱스와 쿼리 계획을 포함하여 테이블 구조를 보여주십시오. –

답변

2
SELECT pe.id 
FROM SHOP.person pe 
WHERE EXISTS (
    SELECT *  
    FROM SHOP.contactperson cp 
    WHERE cp.personid = pe.id 
    AND cp.companyid = 5 
    ); 
+0

제안 된 쿼리와 쿼리의 실행 계획을 확인한 결과 Darhazer가 제안한 쿼리가 동일하다는 것을 확인했습니다. 어떤 상황에서이 쿼리는 Darhazer가 제안한 다른 솔루션을 더 잘 수행 할 수 있습니까 ??? –

+0

그들은 다릅니다. 사람과 접촉자 사이에 1 : N 관계가있는 경우 (예상했지만 데이터 모델을 알지 못했을 때), Darhazer의 쿼리는 1 인당 둘 이상의 행을 생성하고 정확히 하나를 찾습니다. – wildplasser

1

조인 절이 원래 쿼리와 동일한 필드를 사용하고 있지 않습니다. contactperson 테이블에서 personid를 사용해야합니다. 우리가 알아야 ** ** (및 버전) 사용중인 콘크리트 무엇 데이터베이스 -

SELECT person.id 
FROM SHOP.person 
Join SHOP.contactperson 
ON person.id = contactperson.personid 
WHERE contactperson.companyid = 5; 
+2

'contactperson.personid'가 유일하지 않은 경우 여전히 다른 결과를 반환 할 수 있습니다. –