我有一个表叫test,里面有3千万条数据,现在我想从表的最后面数据开始删除二千万条,只保留最前面的一千万条,请问该怎么做呢?
谢谢了
谢谢了
解决方案 »
- 问下,在Windows xp系统下安装完了oracle 10G之后,建了一个orcl数据库之后,如何做才能让java应用程序能访问数据库orcl并且进行insert、update、delete等呢?
- sleect count(*) 慢!!!!!!!!!!!!
- oracle 什么是数据仓库
- oracle function 奇怪问题
- 奇怪的事情,关于dblink在线等,高分相送....求救!!!
- 工作中遇到一个sql,请教各位以下问题,点拨一下思路和解决办法,谢谢!!
- 表对象的一些问题
- 配置监听
- 如何用sql语句关闭或清空游标? 急
- 如何在一个procedure中把出错信息导入到一个文本文件中记录下来?
- 存储过程创建临时表,然后把数据存到里面,在取出结果集怎么写???
- 高手快来帮忙(字母转数字的问题)
(
select id from
(select id,rownum as rn from table order by id )
where rn=20000000
)实际上你删除如此多的数据,最好的方式是:create table table_temp
as
select * from table
where rownum<=1000000//1000w
order by id;
truncate table table;
insert into table
as select * from table_temp;
利用存储过程分批delete ,然后commit
否则会超慢,具体的存储过程就不在这里贴
as
select * from table
where rownum <=1000000//1000w (************)
order by id; (************)
truncate table table;
insert into table
as select * from table_temp; 关键在于该条SQL语句中的ROWNUM这个伪列,它不受同层SQL语句ORDER BY 子句的影响
这样就可以准确删除:
delete tab1 where xxxkey in(select * from (select xxxkey from tab1 order by xxxkey desc) where rownum<=20000000)
select *
from table
where rownum = 200000000
order by asc
需要先order by 再rownum <=1000000//1000w
2, truncate 当前表
3, 再把temp表中的1000万记录BATCH INSERT到当前表
注意取前1000万条件记录时不能用ROWNUM, 而应该利用ROWID
需要的话,分批删除,最后再MOVE,重建索引,分析表;
不需要的话,直接取前1千万条记录重建一张表。另外,碰到这种大表,别忘了采用表分区。
发表于:2008-01-31 17:31:0813楼 得分:0
较好的办法是:新建一个同表,然后导入前面的1000W条,再drop掉原表,最后重命令新表这样做可以优化性能,还可重建索引等这样同时优化的做法。
2. truncate table table_old ;
3. insert into table_old select * from table_new;
4. drop table table_new;