2012-06-26 188 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是不必要的。 –