2012-06-26 2 views
-1

15k 레코드를 삭제하는 SQL 삭제 쿼리가 있습니다. 다음의 형식입니다 :SQL에서 DELETE 문을 실행하는 데 너무 오래 걸림

연산자
query += """ DELETE FROM table1 
      WHERE attr1 IN (SELECT distinct attr2 
             FROM table2 
             WHERE condition1 = %d 
             AND condition2 = %d); 
     """ %(val1, val2) 

이 시간이 많이 걸립니다. JOIN으로 변환하여 실행 시간을 단축하는 방법을 알려주십시오.

+1

는 당신이 내부 쿼리에서 구별이 필요하지 않습니다 – avasal

+0

파이썬 관련이 없습니다. 실행 계획은 무엇을 말합니까? 실적을 어디에서 잃었습니까? 어떤 DBMS입니까? –

+0

어느 데이터베이스를 사용하고 있습니까? –

답변

2

IN 연산자 대신 JOIN을 사용하고 조인 조건에 사용되는 필드에 색인을 만듭니다. attr1, condition1condition2 열에

DELETE FROM table1 using table2 Where attr1 = attr2 And condition1 = %d AND condition2 = %d; 
+0

Postgres가 IN 및 JOIN 솔루션에 대해 동일한 실행 계획을 만든다면 놀라지 않을 것입니다. 옵티마이 저는 이런 종류의 것들에 대해 꽤 똑똑합니다. –

+0

table2를 사용하여 DELETE FROM table1 구문을 시도했습니다 attr1 = attr2 및 조건 1 = % d AND 조건 2 = % d; 하지만 "On"에서 오류가 발생합니다. – user977933

+0

@ user977933, 장소에 ON을 입력했습니다. 이제 정답을 시도하십시오. –

0

를 추가해보십시오 인덱스는 성능을 향상시킬 수 있습니다.

+0

attr1에 대해 1 개의 인덱스를 의미하고 condition1 및 condition2에 대해 2 번째 인덱스를 의미합니까? – Aprillion

+0

@deathApril. –

+0

@ aF .: 형식을 알려주시겠습니까? 나는 혼란 스럽다. – user977933

1

하위 쿼리와 IN 절에서 Distinct를 제거하십시오. 대신 Where Where를 사용하십시오. 귀하의 고유로 인해 내부 오더가 생겨 더 많은 시간이 소요됩니다.

또한 table1.attr1과 table2.attr2를 색인화하십시오.

query += """ DELETE FROM table1 
     WHERE Exists (SELECT null 
            FROM table2 
            WHERE condition1 = %d 
            AND condition2 = %d 
            and table2.attr2 = table1.attr1); 
    """ %(val1, val2) 
+1

PostgreSQL은 결과가 매우 큰 경우에만 정렬을 사용합니다. 그렇지 않은 경우에는 별개의 경우 해시 알고리즘을 사용합니다. 그러나 일반적으로 DISTINCT는 불필요하다는 데 동의합니다. –

관련 문제