[开发日志]SQL2008删除大量数据
2015-09-22 02:49
190 查看
常见问题:工作中数据库难免产生大量的日志,而用户可能关心的只有最近一个月左右的,这些日志占用了服务器磁盘,还可能影响了服务运行效率。甚至在数据库迁移时更因为体积而带来巨大麻烦。
那么,在需要时,删除不再关注的日志,就很必要。
解决思路:肯定第一反应是想delete,可实际操作的人都知道,这个效率。。
我第二反应是重新建表,drop和create,但所有数据都会删掉。
然后就想要不就把最近的数据插入一个表,再执行drop和create,再插入回新表。。似乎可行。。
接着网上去搜索。。。然后找到博客园大神 舍长 的帖子: http://www.cnblogs.com/panchunting/archive/2013/04/27/SQL_Tech_001.html.差不多按他最后的方法解决的。
解决方法:
我最后的操作步骤是这样的:
大数据之删除
小结:
TRUNCATE太快了,清除10W数据一点没压力,批量删除次之,最后的DELTE太慢了;
TRUNCATE快是因为它属于DDL语句,只会产生极少的日志,普通的DELETE不仅会产生日志,而且会锁记录。
那么,在需要时,删除不再关注的日志,就很必要。
解决思路:肯定第一反应是想delete,可实际操作的人都知道,这个效率。。
我第二反应是重新建表,drop和create,但所有数据都会删掉。
然后就想要不就把最近的数据插入一个表,再执行drop和create,再插入回新表。。似乎可行。。
接着网上去搜索。。。然后找到博客园大神 舍长 的帖子: http://www.cnblogs.com/panchunting/archive/2013/04/27/SQL_Tech_001.html.差不多按他最后的方法解决的。
解决方法:
我最后的操作步骤是这样的:
--开启日志无限制--手动,还没找对应语句 --第一条语句会把所有要保留的数据先存放至表#keep中(表#keep无需手工创建,由SELECT INTO生效) SELECT * INTO #keep FROM EquipmentsLoginLog WHERE WithDrawTime>'2015-09-01' --第二条语句用于清除整个表中数据,产生的日志文件基本可以忽略; TRUNCATE TABLE EquipmentsLoginLog --第三条语句用于还原保留数据。--不查询标识符的id字段 INSERT into EquipmentsLoginLog ([A],B) SELECT A,B FROM #keep --清理产生的日志文件 DBCC SHRINKDATABASE(TransmitPlatformDB) --再手动限制日志大小
大数据之删除
小结:
TRUNCATE太快了,清除10W数据一点没压力,批量删除次之,最后的DELTE太慢了;
TRUNCATE快是因为它属于DDL语句,只会产生极少的日志,普通的DELETE不仅会产生日志,而且会锁记录。
相关文章推荐
- vc2010下mongodb驱动的编译与环境搭建
- 使用SQL Server CONVERT() 函数
- oracle数据导入不成功
- SQLite在多线程环境下的应用
- MySQL实现嵌套集合模型
- 将xml文件作为一个小的数据库,进行学生的增删改查
- MySql数据库对象
- MySQL5.6安装图解(windows7/8_64位)
- ORACLE随机数DBMS_RANDOM包
- Oracle SQL Developer显示的时间包含时分秒的设置方法
- Windows下php_memcached编译
- spring 的 RedisTemplate解决Serializer
- MySQL存储过程详解 mysql 存储过程
- mysql 过滤查询(以字母开头,以数字开头,非数字开头,非字母开头)
- mysql select相关基础知识
- JDBC数据库操作
- iOS:CoreData数据库的使用一(创建单个数据库表)
- Mysql报Cannot load from mysql.proc. The table is probably corrupted
- Win2008 r2 下修改mysql data目录的方法
- configuration Oracle Grid Infrastructure for a Standalone Server