我想把数据库中的一个表的数据删除一些(因为数据比较多了点),表中数据大概有有十几亿行,所以我写了一个语句准备把要删除的数据按条件删除
语句为:deleted from T_History where LDate = '2010-06-01'
这条语句我执行后,历时6个小时没有得到结果
请问高手们,如何快速的有条件的删除这些数据?
语句为:deleted from T_History where LDate = '2010-06-01'
这条语句我执行后,历时6个小时没有得到结果
请问高手们,如何快速的有条件的删除这些数据?
LDATE是不是索引的键,把相关索引删了试试
大数据量删除要考虑一下问题:
1、日志容量问题,因为删除大量数据会产生大量日志。
2、锁提升问题十几亿的数据,最好用top N的方式批量删除。否则表会一直锁定,一旦出现服务器问题,启动会比较棘手。
如果保留下来的数据是少数,可以先存出来。
然后直接truncate table XXX 来的快些。
WHILE 1=1
BEGIN
DELETE from T_History where LDate = '2010-06-01'
IF @@ROWCOUNT<5000
BREAK;
END
--LDate 上有索引没有,索引也能加快速度,不过也要维护索引
--这样就会避免锁定TB
DECLARE @max_Count int
SELECT @max_Count=10000
WHILE @max_Count=10000
begin
deleted top 10000 from T_History where LDate = '2010-06-01'
select @max_Count=@@rowcount
-- waitfor delay '00:00:03'
end
WHILE 1=1
BEGIN
DELETE from T_History where LDate = '2010-06-01'
IF @@ROWCOUNT<5000
BREAK;
END
SET ROWCOUNT 0
一般操作是删除索引,然后DELETE数据,再重建索引.数据太大,这样的操作也会很费时间的。
其实,不一定要去DELETE掉,可以在前台控制就可以~~你前台控制忽略那部分数据这样比较好。
大表尽量少DML DDL操作吧。
比如是 Delete from T_History where LDate = '2010-06-01 12:32:42'
但是结果和范围大点的时间段一样
很慢
DML data manipulation language 数据库操作语言,就是增删改查这些;
DDL data definitition language 数据库定义语言,create、alter的。。google下就有了。
2 请进行数据库网格化分割或请建立NDF文件放到其他逻辑分区,增加I/O性能
解释 1 DML 会有日志,而且不少所以请先DUMP你的日志
2 增加NDF 的原因是继续插入的数据引入到其他逻辑盘,减小你在删除数据库时对删除数据逻辑盘的
I/O压力。