SQL Server删除大量数据相关问题

       到了年底需要核查数据库的日子。今天才核查一个大型数据库的时候,发现了一个因为bug未做删除写入了一亿条数据的表,还好只是一张展示数据的表。借这个机会真好来说下删除大量数据踩过的坑。

  • Delete 

SQL语法:Detele 表名 where 条件

优点:按条件删除

缺点:慢!很慢,而且当删除庞大的数据时,会强势的占有整张表格,让你什么也干不了。干不了也就算了,执行的删除还不能停,因为SQL Server中的Delete是一个事务的执行方法,在执行的过程中强行终止,他会回滚到做这个删除操作之前。想象一下,一次性删除100万条数据,执行方法一直在那里转个4,50分钟,你还不知道删除了多少了的情况...

适用方向:删除按条件查出来的少量数据。

优化方案:优化的方向是避免数据库的长时间占有,将大量的数据通过循环的方式批次处理。适用于需要删除按条件查出来的大量数据,同样需要花费很长的时间,但是不会长期占用表。

WHILE 1 = 1
BEGIN 
   DELETE TOP(5000) FROM dbo.Table  WHERE time< '2016-12-12';
   IF @@rowcount < 5000 
    BREAK;
END

利用循环的方式来删除表中的数据,每次只删除5000条,这样可以随时对删除的操作进行停止,并且不会回退正在执行的这个5000条以外的其他操作,同时降低了表单表的长时间占用,单也不可避免的将延长整个过程的执行时间。

  • TRUNCATE TABLE

SQL语法:TRUNCATE TABLE 表名 

优点:快!很快,直接清空对应表下的所有数据,不管表内有多少数据,都基本能够直接执行完成。

缺点:不能够添加条件查询,不会写入日志,直接删除完所有数据。

适用方向:单表内容的全部删除。

优化方案:优化的方向通过条件查询,将不需要删除的数据复制到另一张不同名称相同列的表中,再通过TRUNCATE的方法将前一张表格中的数据直接清空并删除,再将新生成的表重命名为删除的表。适用与数据量大,但需要保留少量数据,删除大量数据的情况。能非常快的删除这些数据。

--将表Table1中time> '2016-12-12'的数据拷贝到自动创建的表Table2中。

SELECT * INTO Table2 FROM Table1 WHERE time> '2016-12-12'

--清空Table1表

TRUNCATE TABLE Table1

--删除Table1表

DROP TBALE Table1

--将表Table2的表名修改成Table1

EXEC SP_RENAME 'Table2','Table1'

速度飞快!

 

 

你可能感兴趣的:(数据库)