gpt4 book ai didi

sql - 如何批量删除Oracle表中大量数据

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:41 24 4
gpt4 key购买 nike

我正在使用 Oracle 10g 并想从 Persons 表(总共有 1500 万条记录)中删除大约 500 万条记录,这些记录在 Order 表(总共有 500 万条记录)中没有任何引用

由于一次删除 500 万条记录会导致 undo log 问题,因此我决定以 10 万条为一批进行删除。我正在使用以下查询:

DELETE FROM Persons p
WHERE City = 'ABC'
AND NOT EXISTS
(SELECT O_Id
FROM Orders o
WHERE p.P_Id = o.P_Id)
AND ROWNUM <= 100000

现在的问题是,这个查询执行 10 万条记录所花费的时间与执行 500 万条记录所花费的时间一样长,因为仍然会在两个表上进行全表扫描和连接。

是否有一种有效的方法来重写此查询以加快执行速度?或者用更好的连接条件替换 NOT EXISTS 子句?或者使用一些更好的方法将记录限制为 100k?

附言这只是一次性操作,我不能为此使用任何 DDL 操作,但是 pl/sql 没问题

最佳答案

根据我的经验,删除大量行的最快方法是:

解决方案 1(Tom Kyte 推荐)

`SET TRANSACTION USE ROLLBACK SEGMENT <your_seg>
DELETE FROM <tab1> WHERE <cond>
COMMIT`

解决方案 2

`create table new_table unrecoverable as select * from old_table where ....;
drop table old_table;
rename new_table to old_table;
create index old_table_idx1 on old_table(c1,c2) unrecoverable parallel 5;
`

我在不同的上下文中使用了第二种解决方案:删除大量行总是最快的。

另一种方法是将要删除的数据放在一个分区中,然后删除该分区(每个分区都有自己的回滚段,可以使用并行性,...)。

关于sql - 如何批量删除Oracle表中大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26930441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com