2014-12-25 4 views
0

나는 postgresql 데이터베이스와 함께 일하고 있는데 쿼리 (첫 번째)를 개선하고 싶다. 나는 그것을 두 번째 것으로 다시 쓴다. 그러나 나는 "NOT IN"이 매우 느린 건설이라고 말하는 기사를 읽었습니다. 나는 당신이 두 명 중 어느 것이 더 빠르며 더 나은 해결책을 제시하길 바란다.어느 sql 쿼리가 더 빠릅니까?

첫 번째 쿼리

UPDATE reseller_product d SET status=3 FROM (
    SELECT reseller_product.sku FROM reseller_product 
    LEFT OUTER JOIN main_table ON main_table.sku=reseller_product.sku 
    WHERE main_table.sku IS NULL AND reseller_product.reseller_id='||resID||' 
)as r 
WHERE d.sku=r.sku and d.distributor_id='||distrID||' and d.reseller_id='||resID||' 

두 번째 쿼리

UPDATE reseller_product SET status=3 
WHERE distributor_id='||distrID||' AND reseller_id='||resID||' 
AND sku NOT IN (SELECT sku FROM main_table); 

편집

죄송합니다, 두 번째 쿼리에 이름이 "D"와 오류를 발견하지 않았다

+2

대답은 .sku의 고유성과 고유성 및 카디널리티에 따라 달라집니다. BTW :'NOT EXISTS()'를 사용하는이 쿼리의 세 번째 버전이 있습니다. 두 번째 쿼리에는 상관 관계 이름'd'가 정의되어 있지 않습니다. 따라서 쿼리가 실패하므로 가장 빠릅니다. – wildplasser

+0

"EXPLAIN"명령을 사용하여 쿼리의 실행 계획을 자세히 설명 할 수 있습니다.이 도움이 될 수 있습니다. http://www.postgresql.org/docs/9.2/static/sql-explain.html –

+0

@wildplasser the correlation 이름 d가 두 번째 쿼리에 정의되어 있지 않습니다. 따라서 쿼리가 실패하므로 가장 빠릅니다. 이것은 정말로 진실하고 재미 있습니다. :) –

답변

-1

세 번째 버전 :

UPDATE reseller_product u 
SET status = 3 
WHERE u.distributor_id = '||distrID||' 
    AND u.reseller_id = '||resID||' 
    AND NOT EXISTS (
    SELECT * FROM main_table m 
    WHERE m.sku = u.sku 
    ); 
0

쿼리를 재 작성하는 것은 다소 도움이 될 수 있지만, 내가 먼저 main_table 여부를 확인하고 모두 sku에 인덱스가 reseller_product 것입니다. 인덱싱되지 않은 필드를 검색 (및 조인)하면 O (n) 복잡성이 발생하지만 인덱싱 된 필드의 경우 인덱스 구현에 따라 O (log (n)) 또는 상수가됩니다.

관련 문제