删除海量数据之全表删除与部分删除

摘要:
删除海量数据时,如果想要提升性能,需要考虑的一个重要因素就是:如何减少日志操作?EXECsp_rename'TAB_NAME','TAB_NAME_OLD'EXECsp_rename'tmp','TAB_NAME'--createindex/constraint/trigger...onnewTAB_NAMEDROPTABLETAB_NAME_OLD删除表里约一半数据这时,如果表上没有分区的话,就会慢的特别明显,的确没什么好的办法,只能用DELETE慢慢删除。另外,ORACLE中的NOLOGGING选项,类似于SQLServer中的BULK_LOGGED恢复模式,在批量数据操作时才有效,比如:SELECT…

删除海量数据时,如果想要提升性能,需要考虑的一个重要因素就是:如何减少日志操作?

1. 全表删除
全表删除的方式通常有3种:DROP, TRUNCATE, DELETE
(1) DROP/TRUNCATE
DROP和TRUNCATE是DDL操作,日志量都很少(只有回收数据页的记录,不记录页内每条数据的明细),都释放所有数据页,以及重置IAM、PFS、GAM、SGAM中的标志位,释放的数据页可被其他表使用;

所不同的是,DROP同时也删除了系统目录里对于表的定义,相应的,表上所有定义的对象:INDEX、CONSTRAINT、TRIGGER等等也都将被删除,该表相关的IAM、PFS、GAM、SGAM页也将被释放(不只是重置标志位);

(2) DELETE
不带条件的DELETE可以用来删除全表数据,所有被删除的行都将被记录日志,做全表删除时效率较差,不推荐;

2. 部分删除
对于表中部分数据做删除,如果是分区表的话,直接TRUNCATE分区是最好了,即使是用DELETE删除分区中部分数据,效率也不会太差;

如果不是分区表的话:

(1) 删除表里少部分数据
直接用DELETE删除;

(2) 删除表里大部分数据
导出所需要保留的少数记录到临时表,然后TRUNCATE原表,再把临时表数据导回来;
举例:

SELECT *INTO tmp FROM TAB_NAME 
WHERE DATE_COL > = GETDATE()-1
TRUNCATE TABLE TAB_NAME
INSERT INTO TAB_NAME 
SELECT *FROM tmp
DROP TABLE tmp

如果不想再把临时表数据导回来,也可直接删除原表TAB_NAME,把tmp重命名为原表名,但不要忘了在tmp上创建原表的对象,如:索引/约束/触发器等等。

EXEC sp_rename 'TAB_NAME', 'TAB_NAME_OLD'
EXEC sp_rename 'tmp', 'TAB_NAME'
--create index/constraint/trigger...on newTAB_NAME
DROP TABLE TAB_NAME_OLD

(3) 删除表里约一半数据

这时,如果表上没有分区的话,就会慢的特别明显,的确没什么好的办法,只能用DELETE慢慢删除。

另外,ORACLE中的NOLOGGING选项,类似于SQL Server中的BULK_LOGGED恢复模式,在批量数据操作时才有效,比如:SELECT…INTO(ORACLE中对应create table as select * from…),CREATE/ALTER INDEX 等等。并不是任何时候这个选项都有效的。

小结

(1) 海量数据的删除,尽量选择日志量较小的方式进行;
(2) NOLOGGING选项/BULK_LOGGED恢复模式,在删除数据时,派不上用场,通常用在批量导入或更新数据时。

免责声明:文章转载自《删除海量数据之全表删除与部分删除》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇重写 geturl Openlayers中使用TileCache加载预切割图片作为基础地图图层FineReport连接多维数据库示例及操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

testng 接口测试,读取Excel表格数据,做数据驱动2(读取某些固定列数据)

testng public classTestRegister { @Test(dataProvider="datas") public voidtest1(String,url,String username,String pwd){ Map<String, String> params = ne...

SqlServer数据库脱机和分离的区别

脱机和分离的区别: 分离和脱机都可以使数据库不能再被使用,但是分离后需要附加才能使用,而脱机后只需联机就可以用了。 附加数据库报错: 无法打开物理文件 XXX.mdf"。操作系统错误 5:"5(拒绝访问。)"。 (Microsoft SQL Server,错误:5120) 解决方法: 找到xxx.MDF与xxx_log.LDF文件和所在的文件夹 右键-属性...

mongodb数据库磁盘碎片整理。

更新主题:数据库磁盘碎片整理。 更新说明:服务器mongodb数据库磁盘碎片整理。 更新时间:10.17-10.26 更新步骤: 从节点操作 关闭monitor监控程序; 确认是否从节点; Admin运行shutdownServer,关闭mongodb xmshard:SECONDARY> use admin xmshard:SECONDARY&...

SqlServer关于“无法删除数据库 "XXXX",因为该数据库当前正在使用”问题的解决方案

引言 在项目中,通过使用SQL语句“DROP DATABASE [数据库名]”删除数据时,一直出现“无法删除数据库 "XXXX",因为该数据库当前正在使用”的错误信息,经测试在SqlSever数据库客户端中,直接执行该Sql语句可以正常执行,但是通过OLEDB执行该Sql语句,就出现上述错误,笔者查阅相关文档,找到了解决该问题的方法。 解决方法 将要删除的...

136-如何访问redis数据库

//当我们使用Redis的时候,并没有注入Mapper,反而时注入了一个redisTemPlate @Autowired private RedisTemplate<Object,Object> redisTemplate; @Override public Integer queryUserCount() {...

揭秘万亿级别的全域数据统计分析平台技术架构演进

作者:友盟+技术专家 王翔 截止到2019年6月,友盟+已累计为180万移动应用和815万家网站提供10年的专业稳定数据服务;当前友盟+每天接收日志量达万亿级别,实现每秒处理2亿次事件的能力,相当于每眨眼一次,就有2亿数据被刷新了!友盟+数据存量高达50PB,相当于A4纸正反面写满数字并装满15万辆卡车;且还在持续快速增涨,如何搭建一个高可用、高安全、高性...