我有两个表:old_data
和new_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行时需要一个小时。
有更有效的方法吗?
答案 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
表;