项目场景:
orcl 快速删除表中百万或千万数据
orcl 数据库表中数据达到上千万时,常规写入日志,删除非常慢
bqh8表中目前有10000000条数据,需要保留19条数据,其余全部清除掉。
注意:使用 truncate 删除表数据不可恢复!
1、首先把需要保留的数据备份到temp1临时表中。
create table temp1 as select * from deleteTableName where id<20;
select * from temp1;
2、然后再用truncate删除整个表的数据。
truncate table deleteTableName ;
select * from deleteTableName ;
3、最后再把temp1表中的数据复制到bqh8表中。
insert into deleteTableName select * from temp1;
commit;
select * from deleteTableName ;
truncate与delete的区别:
1、在功能上,truncate是清空一个表的内容,它相当于delete from table_name。
2、delete是dml操作,truncate是ddl操作;因此,用delete删除整个表的数据时,会产生大量的roolback,占用很多的rollbacksegments, 而truncate不会。
3、在内存中,用delete删除数据,表空间中其被删除数据的表占用的空间还在,便于以后的使用,另外它是“假相”的删除,相当于windows中用delete删除数据是把数据放到回收站中,还可以恢复,当然如果这个时候重新启动系统(OS或者RDBMS),它也就不能恢复了!
而用truncate清除数据,内存中表空间中其被删除数据的表占用的空间会被立即释放,相当于windows中用shift+delete删除数据,不能够恢复!
4、truncate 调整high water mark 而delete不;truncate之后,TABLE的HWM退回到INITIAL和NEXT的位置(默认)delete 则不可以。
5、truncate 只能对TABLE,delete 可以是table,view,synonym。
6、TRUNCATE TABLE 的对象必须是本模式下的,或者有drop any table的权限 而 DELETE
则是对象必须是本模式下的,或被授予 DELETE ON SCHEMA.TABLE 或DELETE ANY TABLE的权限。7、在外层中,truncate或者delete后,其占用的空间都将释放。
8、truncate和delete只删除数据,而drop则删除整个表(结构和数据)。
TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE
TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。 DELETE
语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE
通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。 TRUNCATE TABLE
删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。 如果想保留标识计数值,请改用
DELETE。 如果要删除表定义及其数据,请使用 DROP TABLE 语句。
ORA-01502: 索引或这类索引的分区处于不可用状态
@Override
public void run() {
bytes = mmInStream.read(buffer);
mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();
}
原因分析:
原因: 出现这个问题,可能有人move过表,或者disable 过索引。
- alter table xxxxxx move tablespace xxxxxxx 命令后,索引就会失效。
- alter index index_name unusable,命令使索引失效。
例如:Handler
发送消息有两种方式,分别是 Handler.obtainMessage()
和 Handler.sendMessage()
,其中 obtainMessage
方式当数据量过大时,由于 MessageQuene
大小也有限,所以当 message
处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失。
解决方案:
- 重建索引才是解决这类问题的完全的方法。
alter index index_name rebuild (online);
alter index index_name rebuild;
- 如果是分区索引只需要重建那个失效的分区 。
alter index index_name rebuild partition partition_name (online);
或者alter index index_name rebuild partition partition_name;
- 或者改变当前索引的名字。
oracle相同数据取第一条,oracle去除重复, 获取取最新的第一条数据
row_number() over ( partition by ‘去重列名称’ order by ‘排序列名’ desc ) as group_idx