首页 新闻 会员 周边

SQL2005多线程写入和计划任务的冲突

0
悬赏园豆:5 [已解决问题] 解决于 2016-04-19 16:59

现有一项目,每分钟360条数据的写入,使用的是纯SQL语句,没有使用存储过程。

现在数据积累到了4千万条,为了减少数据库容量,提高查询速度。

我在SQL2005企业管理器中设置了计划任务,每个星期备份数据库,并清除三个月之前的数据记录和系统运行日志。

其中计划任务中清除数据,我使用的SQL:
delete from monitor where datediff(mm,addtime,getdate())>3

实际执行的效果,删除速度很慢。

 

问题归纳如下:

在监控系统正常运行的情况下,SQL2005的计划任务启动后,数据库的读写冲突了。

造成系统无法正常使用。

请问如何解决这个问题,谢谢!

PKSEO_dudu的主页 PKSEO_dudu | 初学一级 | 园豆:9
提问于:2016-04-19 09:41
< >
分享
最佳答案
0

别的不说,你这语句当然慢了

delete from monitor where datediff(mm,addtime,getdate())>3

你思考一下

delete from monitor where addtime<dateadd(mm, -3, getdate())

这样会好点。

 

收获园豆:5
爱编程的大叔 | 高人七级 |园豆:30839 | 2016-04-19 12:31

我修改了一下   你看这样是不是要更快一点?

DELETE
    FROM dt_monitor
    WHERE id<
        ( SELECT top 1 id
         FROM dt_monitor
         WHERE datediff(mm,[datetime],getdate())>3
         ORDER BY id DESC )

 

还有是不是计划任务删除数据的时候,程序写入数据,会有冲突!

谢谢

PKSEO_dudu | 园豆:9 (初学一级) | 2016-04-19 12:36

@PKSEO_dudu: 说了不要用Datediff了,你不明白?

你这样使用datediff有1千万条记录,就要计算1千万次。

 

delete from monitor where addtime<dateadd(mm, -3, getdate())

修改为

declare @date datetime

set @date=dateadd(mm, -3, getdate())

delete from monitor where addtime<@date

爱编程的大叔 | 园豆:30839 (高人七级) | 2016-04-19 12:37

@爱编程的大叔: roger that ! 谢谢

PKSEO_dudu | 园豆:9 (初学一级) | 2016-04-19 12:38

@爱编程的大叔: 

计划任务中  执行 delete的同时,程序写入大量数据,是不是会有问题?

现在就是程序会无法写入数据,请教一下! 谢谢

PKSEO_dudu | 园豆:9 (初学一级) | 2016-04-19 14:20

@PKSEO_dudu: 可能会有问题,可能没有问题,这个无法一概而论。

现在是你出现问题了,你只要想怎么解决就行了。

爱编程的大叔 | 园豆:30839 (高人七级) | 2016-04-19 15:53

@爱编程的大叔: 非常感谢!

PKSEO_dudu | 园豆:9 (初学一级) | 2016-04-19 16:59
其他回答(1)
0

sqlserver 2005 微软都不维护了 还不换吗?

tkbSimplest | 园豆:205 (菜鸟二级) | 2016-04-19 10:12

老项目了,没办法!

兄弟,你看了我这个问题,有没有什么解决办法?谢谢!

支持(0) 反对(0) PKSEO_dudu | 园豆:9 (初学一级) | 2016-04-19 10:13

@PKSEO_dudu: 写个程序不行吗?监视你的记录和日志?

支持(0) 反对(0) tkbSimplest | 园豆:205 (菜鸟二级) | 2016-04-19 10:23

@tkb至简: 会不会是计划任务在删除数据的时候把表锁死了,由于数据量过大!

支持(0) 反对(0) PKSEO_dudu | 园豆:9 (初学一级) | 2016-04-19 10:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册