2012-06-26 218 views
-1

我有一個sql刪除查詢invovles刪除15k記錄。 下面是格式:在SQL執行DELETE語句花費太長的時間執行

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

這操作需要大量的時間。 請建議我如何將它轉換成JOIN,這將需要更少的時間來執行。

+1

與python無關 – avasal

+0

在內部查詢中不需要區分。執行計劃說什麼?你在哪裏失去表現?這是哪個DBMS? –

+0

你正在使用哪個db。 –

回答

2

使用JOIN代替IN運算符,併爲加入條件中使用的字段創建索引。在attr1condition1condition2

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

如果Postgres爲IN和JOIN解決方案創建相同的執行計劃,我不會感到驚訝。優化器對這些事情非常聰明。 –

+0

我試過了語句DELETE FROM table1 using table2 On attr1 = attr2 and condition1 =%d AND condition2 =%d;但它在「開」時給我錯誤。 – user977933

+0

@ user977933,我在Where處輸入ON。現在嘗試更正的答案。 –

0

嘗試添加索引來提高性能。

+0

您的意思是attr1的第一個索引和condition1和condition2的第二個索引? – Aprillion

+0

@deathApril準確。 –

+0

@aF .:你能給我格式嗎?我很困惑。 – user977933

1

刪除不同於子查詢和IN子句。請使用Where EXISTS。 你的不同將導致一個內部訂單,這將消耗更多的時間。

並且還索引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是不必要的。 –