delete的速度和锁表,看似简单的一个问题却搞不定,大家帮忙看看

qb_zhm 2005-07-04 03:52:59
有没有办法加快 delete 的速度?不能用 truncate 因为有一部分数据要保留,大批量数据删除的时候,delete执行得非常慢

有没有办法在执行 delete 的时候, insert 能正常执行?如果 insert能正常执行,delete慢就慢了,不管它了


具体的需求是,有几个日志表,有数百万条记录,而且每天都会增加十几万条记录,需要每天定时删除很早以前的记录,24小时不停机,要求在5分钟内清除数据,就是大约删除十几万条记录,
因为 Delete 锁表,会导致insert执行不了,在执行delete的时候,程序就无法写入日志了,而且会一直在等待,希望有一个好的办法,能在不影响正常应用的同时,把老数据清除
...全文
1295 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2006-01-09
  • 打赏
  • 举报
回复
delete 肯定要写日志, 数据库恢复模式只决定写的日志的详细程度而已.
javanow 2006-01-09
  • 打赏
  • 举报
回复
我不同意delete 动作要写日志的观点。

你可以做个实验,恢复模式改为简单模式,一次或分批删除 100 万条记录,你看日志是否会增长 。

--------------------------
http://chinadba.cn
深圳骄子数据库服务网
最具实战经验的数据库优化、管理、设计、培训。
1月6号更新了2篇文档
欢迎订阅文档更新通知
lsqkeke 2006-01-09
  • 打赏
  • 举报
回复
学习
yitangliang 2006-01-09
  • 打赏
  • 举报
回复
楼上的好,Delete动作肯定是要写日志的,而且在事务结束以前也会锁住相关资源的,无论你的恢复模式设置成哪一种!
建议
1 分批删,这样事务可以短点,完成的快些,锁定的资源也会少。
2 空闲时候删。
3 事先将日志文件手工扩大,以满足大量日志记录的需求。
4 正如楼上说的,如果保留的数据不太多!
lcooc 2006-01-09
  • 打赏
  • 举报
回复
学习中……
batiraul 2006-01-09
  • 打赏
  • 举报
回复
不管日志不日志,分批量删除就不会对insert/select造成太大影响,做个定时数据库job在凌晨某时段开始删除数据,比如job运行间隔为5分钟,每次job运行只删除1w到5w条记录
javanow 2006-01-09
  • 打赏
  • 举报
回复
刚才自己在2种恢复模式下测试了一把,如邹大哥所说,我的"delete 时在简单恢复模式下不会写日志"的说法是错误的。

谢谢,特此更正。
新鲜鱼排 2006-01-08
  • 打赏
  • 举报
回复
mark
OracleRoob 2006-01-08
  • 打赏
  • 举报
回复
Mark!
mislrb 2006-01-08
  • 打赏
  • 举报
回复
学习
Roo81 2006-01-08
  • 打赏
  • 举报
回复
另外,检查下这个表的触发器。
看看是否在删除操作发生的时候,有触发器运行。
因为不少应用软件为了保护数据,会在删除数据的时候,把数据保存到另外的表里面去。

楼上说的差不多了。SQL是不可能不记录DELETE操作到日志里面去的。做个日志备份,然后用:DBCC SHRINKFILE (日志文件逻辑名,想要的size mb),就可以了。
Outdll 2006-01-08
  • 打赏
  • 举报
回复
改变设置让Delete操作不记录日志;


-----------这是不可能的.SQL Server引擎做不到这一点
zjcxc 元老 2006-01-08
  • 打赏
  • 举报
回复
删除的数据量大于保留的数据量?

将要保留的数据select into 到一个临时表.
truncate table删除表中所有数据.
再 insert into 从临时表将要保留的数据导回来.
删除临时表.
javanow 2006-01-08
  • 打赏
  • 举报
回复
我以前曾经在一张2亿条的表上不停地删除以前的记录,对表的select,insert一切正常。
我是这样实现的
1:delete子句的定位条件一定要用上索引.
2:一次删除1000到10000条,不要一口吞下个大胖子。
语法为:
--set rowcount x 表示一次只影响x行
set rowcount 10000
delete .... where ...
set rowcount 0

3:如果你想delete不产生事务日志,将数据库的恢复模式修改为简单模式。这会导致你在出现问题时,仅能使用完全备份或差异备份恢复数据。
4:最好能闲时运行。

--------------------------
http://chinadba.cn
深圳骄子数据库服务网
最具实战经验的数据库优化、管理、设计、培训。
1月6号更新了2篇文档
hsj20041004 2005-07-04
  • 打赏
  • 举报
回复
试试:
1、你在删除数据的时候先删除表的索引、主键等,删除完后再建立。
2、你可以在你的机子上加一个内存条。
3、可以将你的操作放在晚上人少的时候运行
子陌红尘 2005-07-04
  • 打赏
  • 举报
回复
直接在单个表上恐怕是无法如愿。
建议楼主对日志表按照时间维度进行分区,使删除数据的操作和插入数据的操作不在同一张表中进行。
pbsql 2005-07-04
  • 打赏
  • 举报
回复
这样的大数据量删除建议在SQL SERVER空闲时做,另外delete大量数据会产生很大的日志,如果不要日志了建议截断日志,否则也会影响SQL SERVER的效率
phantomMan 2005-07-04
  • 打赏
  • 举报
回复
将Delete操作放在晚上人少的时候进行;
改变设置让Delete操作不记录日志;

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧