我想删除Oracle中的大量数据

时间:2020-05-19 04:31:09

标签: sql database oracle

我使用了这段代码,但是花费的时间太长,并且计算机崩溃了:

reader = request.getReader();

我认为我需要对此代码应用批量SQL。

我必须删除2年范围内的数据

请帮助我。

user_date类型为char(20120101000000)

2 个答案:

答案 0 :(得分:1)

72.000.000行很多,因此需要采取特殊措施。我会计算将删除多少行,并使用f.i保存几行:

SELECT todo, count(*) FROM (
  SELECT CASE 
           WHEN user_date BETWEEN '20120101000000' AND '20150101000000' 
           THEN 'delete'
           ELSE 'keep'
         END AS todo
    FROM mytab
) GROUP by todo;

如@Littlefoot所说,如果要删除足够大的数量,我会尝试使用CTAS方法:

CREATE TABLE mytemp NOLOGGING AS
SELECT * FROM mytable 
 WHERE user_date NOT BETWEEN '20120101000000' AND '20150101000000';

DROP TABLE mytable;
RENAME mytemp TO mytable;

警告:您必须重新创建所有索引,特权等。请在测试系统上尝试此操作,最好是在一个小的示例上。

另一方面,如果只删除一小部分行,其余的保留,我将遵循@Tim Biegeleisen的方法:

CREATE INDEX i ON mytable(user_date);

DELETE FROM mytable
 WHERE user_date BETWEEN '20120101000000' AND '20150101000000';

如果您采用第二种方法,并且行数仍然很大,则可能需要通过重组表来释放空间。向DBA咨询。

如果您没有测试系统,则可以通过复制巨大表格的一小部分样本(例如0.1%)来创建:

CREATE TABLE mytest NOLOGGING AS SELECT * FROM mytable (SAMPLE 0.1);

我不完全了解您的日期逻辑,因此在示例中使用了2012年1月1日至2014年12月31日之间的所有日期。

哦,是的,@ a_horse_with_no_name完全正确,永远不要将日期存储在varchar中。

答案 1 :(得分:0)

您正在使用哪个版本的Oracle?如果是19c,则可以

alter table mytable move including rows where user_date NOT BETWEEN '20120101000000' AND '20150101000000' online. 
相关问题