实验目的

今天遇到一个问题,如果数据表中有大量数据,并且不能影响插入操作,该怎么办。

实验过程

1.比如原表是myorder1,有一亿条数据,想删除某个日期之前的数据,日期顺序和聚集索引顺序一致。

2.创建一张myorder1_backup表,仅仅只存储myorder1的聚集索引id。

3.写一个程序,定时执行下面的语句。首先判断第一条日期是否满足条件(这种方法有一个弊端,可能会多删除数据,如果要保证数据准确,需要循环检查这10000条数据是否都满足条件,达到精准过滤),满足条件就将原表的头1万条数据id放到临时表,然后利用myorder1的聚集索引从myorder1_backup筛选数据来删除数据,然后清空临时表myorder1_backup。

declare @count int
set @count=0
while(@count<3)
begin
    --等待5秒
    select getdate()
    waitfor delay '00:00:02:00'
    --每次删除1万条数据,分摊压力

    --查询第一条数据的日期,满足条件就执行下面语句

    --将数据插入临时表
    insert into myorder1_backup (id)
    SELECT top 10000 id FROM myorder1 with(nolock) order by id 

    --从主表删除数据
    delete FROM myorder1
    where id in (select id from myorder1_backup)

    --清除临时表
    truncate table myorder1_backup

    --查看主表数据量
    select count(1) from myorder1
    set @count=@count+1
end

 

转载请注明出处: http://bluesd7.com/蓝影闪电的随笔/ContentId/417/删除运行中服务器中的过期数据

 

评论数量 (0)

    留下一个评论

    剩余2000个字符。 一共限制在2000个字符内.
    发送评论

    搜索

    关于我

    姓名:余钊

    英文名:Joshua

    现居:武汉

    Email: yuzhao_blue@163.com

    关注:架构, 全栈, SQL, 高性能, 高并发

    日历