0

我在 Oracle 数据库中有一对具有一对一父子关系的表。不幸的是,外键是在父级中定义的,而不是在子级中:

-----------------        -----------------        
| messages      |        | payloads      |
-----------------        -----------------
| id            |        | id            |
| payload_id    |------->| content       |
| creation_date |        -----------------
-----------------

messages.payload_idfrom to的关系payloads.id由不可延迟的外键强制执行。

我们有一个查询,它删除了消息创建日期在特定时间之后的所有消息和有效负载。不幸的是,由于反向外键,当前查询如下所示:

DELETE FROM messages WHERE creation_date < deletion_date;
DELETE FROM payloads WHERE id NOT IN (SELECT payload_id FROM messages);

第二个讨厌的删除语句是问题所在,因为当我们在每个表中有大约 5000 万条记录时,它需要一个多小时。

有没有更好的方法来删除所有消息和有效负载?

请注意,不幸的是,架构超出了我们的控制范围......

4

2 回答 2

2

您可以将要删除的 id 记录到全局临时表中,然后发出删除,通过存储 rowid 来优化“消息”中的删除

insert into my_temp_table (messages_rowid, payload_id)
select rowid, payload_id
from   messages
where  creation_date < deletion_date;

delete from messages
where  rowid in (select messages_rowid from my_temp_table);

delete from payload
where  id in (select payload_id from my_temnp_table);

commit;
于 2012-05-29T09:25:40.280 回答
1

怎么样

DELETE FROM payloads WHERE id IN 
  ( SELECT payload_id FROM messages WHERE creation_date < deletion_date)

当然,这需要在从消息中删除之前运行。

于 2012-05-29T09:11:41.673 回答