怎么清空表中一部分数据???

yinliaobao 2012-07-24 09:13:33
我的表一直在用,不能停。表中数据库有三千多万条记录,现在每天以三万条左右的记录增加.

我想把表中2011年以前的记录都清空。

我处理的办法是 :

1.先备份表 .
2.delete from 表名 where 时间 < 2011-01-01

但是表中记录太多,我觉得这方法怕破坏表结构.


请问还有其它好办法清理表数据吗?
...全文
529 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
carpenter01 2012-07-26
  • 打赏
  • 举报
回复
delete from 表名 where 时间 = 2010-01-01;
go;
delete from 表名 where 时间 = 2010-01-02;
go;
... ...
一天一天的删
walkman_22 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
表需要select操作吗?如果一段时间内(比如几小时)不需要select,而是只用来插入,那可以这样:
1 建一张同样结构的表。
2 修改程序,把新数据插入到这张新表里
3 delete原表数据。
4 把新数据插入回原表。


delete操作时,建议一次少删除一些,比如只删除1000条,或只删除一天的数据。不然插入操作容易长时间被锁而失败。
我也有个表,要定时手工delete操作……
[/Quote]
学习了~~~~
稻庄 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
那你还是老老实实的delete吧
[/Quote]
向F姐姐实习
houyajin 2012-07-24
  • 打赏
  • 举报
回复
我觉得你可以建一个JOB,然后执行几次,我们现在的线上有这样的数据。就是表数据量不用的情况下,和业务确认,然后只保留需要的几个月或者几年的数据,其它的数据可以除到备份的库里面,或者就是删除。不要一次删除太大的数据,可以选择批量会更好。
songguangqin 2012-07-24
  • 打赏
  • 举报
回复
如果楼主建立的是Partation table的话就好办了,直接把相应的分区switch out出来然后drop就可以了
  • 打赏
  • 举报
回复

--> 测试数据:[表1]
if object_id('[表1]') is not null
drop table [表1]
create table [表1](
[字段1] varchar(1),
[字段2] varchar(1)
)
go
insert [表1]
select 'a','a' union all
select 'b','a' union all
select 'c','a' union all
select 'd','b' union all
select 'e','a' union all
select 'f','c' union all
select 'g','c'
go


select * from [表1]
/*
字段1 字段2
a a
b a
c a
d b
e a
f c
g c
*/
--truncate用于清空表的记录
truncate table [表1]

select * from [表1]
--表结构存在,记录全部清空
gt_sql 2012-07-24
  • 打赏
  • 举报
回复

select * into #t from 表名 where 时间>='2011-01-01'

delete from 表名

insert into 表名 select * from #t

如楼上建议 你可以分次删除
孤独加百列 2012-07-24
  • 打赏
  • 举报
回复
删除表内容不会破坏表结构的,放心删除。
但是你这种情况最好不要一次删除那么多,最好定时操作每小时删除。
fengyqf 2012-07-24
  • 打赏
  • 举报
回复
表需要select操作吗?如果一段时间内(比如几小时)不需要select,而是只用来插入,那可以这样:
1 建一张同样结构的表。
2 修改程序,把新数据插入到这张新表里
3 delete原表数据。
4 把新数据插入回原表。


delete操作时,建议一次少删除一些,比如只删除1000条,或只删除一天的数据。不然插入操作容易长时间被锁而失败。
我也有个表,要定时手工delete操作,我是这样做的。
--小F-- 2012-07-24
  • 打赏
  • 举报
回复
那你还是老老实实的delete吧
yinliaobao 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
SQL code
select * into #t from 表名 where 时间>='2011-01-01'

truncate 表名

insert into 表名 select * from #t
[/Quote]

truncate 表名 --------表一直在用. 不能动表。。
变味奶茶 2012-07-24
  • 打赏
  • 举报
回复
截取时间字符串啊。
delete from 表明 where SUBSTRING('2011-01-01',0,5)<2011
--小F-- 2012-07-24
  • 打赏
  • 举报
回复
select * into #t from 表名 where 时间>='2011-01-01'

truncate 表名

insert into 表名 select * from #t
luckings 2012-07-24
  • 打赏
  • 举报
回复
对于大表,建议你还是不要一部删到位,删除的记录太多了,有可能temp空间及回滚空间不够用了,导致整库
当掉了,先统计下2011-1-1之前有多少数据,再分批删除,一次删除5w行,分批进行,如果删除的数据占用了表
50%的数据,建议你还是先把不删除的数据转移到一个表里面,然后 truncate表,再把数据倒过来,delete操作
会给表留下很多的碎片。删完建议收缩
zy5251zd_net 2012-07-24
  • 打赏
  • 举报
回复
根据用户所提需求过滤需要删除的源数据,create 临时表 as select rowid rid from 需要删除的表 where 删除条件。




kissyongheng 2012-07-24
  • 打赏
  • 举报
回复
删之前备份一下数据库呗,或者复制一下这个表,再删,delete不会破坏表结构的,好几千万的数据我都是delete from tablename where rq>=''
zhazhuzhao 2012-07-24
  • 打赏
  • 举报
回复
如果数据可以过几个小时看的话,那么可以建一个同结构的表,然后把原来的表名改下,再把新表改成之前的表名,然后你就可以慢慢搞了!
backsteet2 2012-07-24
  • 打赏
  • 举报
回复
看你机器性能如何了,性能好的,直接 DELETE FROM TABLENAME WHERE DATE<'2011-1-1'

每天3万条的话你11年之前的数据也没多少.

如果你机器性能不好,又怕影响业务,那你只能逐步逐步调整时间参数,一个月,或者几个月一删,

34,594

社区成员

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

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