在postgres中删除速度很慢

时间:2015-05-27 02:33:45

标签: sql database postgresql

我有两个表:old_datanew_data

两个表都有列:  ID,日期,价值

我想删除“old_data”中不在“new_data”中但在选定日期之间的所有行。

这适用于psql:

DELETE FROM old_data
WHERE (id, date) NOT IN (SELECT id, date FROM new_data) AND
    id = my_id  AND  date >= 'my_start_date'  AND  date <= 'my_end_date';

每个id的开始/结束日期不同,因此我必须为每个不同的id分别运行DELETE。 “new_data”中有大约1000个不同的id。

问题是它非常慢 - 当“old_data”有1500万行而“new_data”有100,000行时需要一个小时。

有更有效的方法吗?

2 个答案:

答案 0 :(得分:3)

在运行查询之前创建这些索引。

create index old_data_id_index 
on old_data
using btree (id);

create index old_data_date_index
 on old_data
using btree(date);

create index new_data_id_index
 on new_data
 using btree(id);


create index new_data_date_index
 on new_data
using btree(date);

答案 1 :(得分:0)

您可以尝试:

delete from old_data removed
using
    (select od.id, od.date
    from old_data od
    left join new_data nd on nd.id=od.id and nd.date=od.date
    where new_data.id is null) as to_remove
where to_remove.id=removed.id and to_remove.date=removed.date and
-- rest of your conditions:
removed.id = my_id  AND  removed.date >= 'my_start_date'  AND  removed.date <= 'my_end_date';

这应该避免多次扫描new_data表;