我使用了这段代码,但是花费的时间太长,并且计算机崩溃了:
reader = request.getReader();
我认为我需要对此代码应用批量SQL。
我必须删除2年范围内的数据
请帮助我。
user_date类型为char(20120101000000)
答案 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.