【SQL Server性能优化】删除大量数据的方法比较

如果你要删除表中的大量数据,这个大量一般是指删除大于10%的记录,那么如何删除,效率才会比较高呢? 而如何删除才会对系统的影响相对较小呢?

下面先做一个实验,然后对这个实验的结果进行分析,然后得出结论。

1、创建数据库

use master
go

if exists(select * from sys.databases where name = 'test')
   drop database test
go

create database test
go


2、创建表

use test
go


if exists(select * from sys.tables where name = 't')
   drop table t
go

create table t(i int,v varchar(100) default replicate('a',100)
                    ,vv varchar(100) default replicate('a',100),
                    vvv varchar(100) default replicate('a',100));


3、插入数据

用下面的代码添加100000条记录,消耗9秒:

declare @i int;

set @i = 1

begin tran

	while @i <= 100000
	begin
		insert into t(i) values(@i)
	   
		set @i = @i + 1   
	end

commit tran


而如果用下面的代码,添加100000条记录,消耗43秒:

declare @i int;

set @i = 1

while @i <= 100000
begin
    begin tran
		insert into t(i) values(@i)  --每执行一次就提交一次,效率较差  
    commit tran
    
	set @i = @i + 1   
end


重复插入数据,消耗1分38秒

insert into t
select *
from t
go 6


最后总共插入了640万条数据。

4、建立索引

create index idx_t_idx1 on t(i)


5、进行如下设置,是为了预防SQL Server使用太多内存,而导致死机

sp_configure 'show advanced option',1
go
reconfigure
go

sp_configure 'max server memory (MB)',3584
go
reconfigure
go


6、把上面创建的表t数据,复制成t1和t2两个表,对t1表建立索引

if exists(select * from sys.tables where name = 't1')
	drop table t1
go

select * into t1
from t

create index idx_t1_idx1 on t1(i)
go


if exists(select * from sys.tables where name = 't2')
	drop table t2
go

select * into t2
from t


7、对t1表进行删除操作,一次删除1000个数,每个数有64条,所以每次删除64000条。共删除1000次,所以删除640000条记录,总耗时82秒

dbcc dropcleanbuffers
go

declare @i int = 20000;
declare @start_time datetime;-- = getdate();

while @i <30000
begin

	set @start_time = GETDATE();

	delete from t1	where I>=@i  and i<=@i + 999

	set @i += 1000
	select DATEDIFF(second,@start_time,getdate())

end


8、删除t2表的数据,耗时44秒

delete from t2
where I>= 20000 and i<30000

通过上面的测试发现:

1、在大量插入操作时,在完成操作后再提交,比每次插入操作后马上就提交,效率要高。

2、在删除大量数据时,就算运用索引,甚至同时运用索引和分批操作,效率也不如不用索引,直接通过表扫描删除来的高。  

但表扫描的问题是会锁住整个表,阻塞其他事务,导致系统业务大面积瘫痪。

所以,虽然通过直接的删除方法会速度快,但如果通过索引和分批处理,那么只会锁定需要删除的一批数据,而其他的数据则不会锁定,那么导致的阻塞问题就小多了。

3、所以结合上面的2点,当大批量操作时,如果最后提交,那么整个操作效率更高,但是可能会导致阻塞的问题,因为不及时提交,会导致其他事务都被阻塞。

同样的,通过直接删除效率可能更高,但会锁表,会导致严重的阻塞问题,而通过索引和分批处理,虽然效率不是太高,但可以分批处理,相当于分批提交,而每一批都通过索引,只锁住需要处理的记录,而其他的记录都不会锁住,那么就不太会导致阻塞的问题。

所以,大批量的删除操作,如果通过全表扫描,适合在晚上系统比较空闲的维护时间内进行;而如果一定要在白天执行,那么可以考虑通过索引和分批处理,来减少阻塞的问题,但还是会对系统产生一定的影响,特别是内存方面。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server是由Microsoft开发的关系型数据库管理系统(RDBMS)。它是一种功能强大且广泛使用的数据库解决方案,用于存储、管理和处理大量结构化数据SQL Server教程可以帮助您学习如何使用SQL Server进行数据库管理和查询。以下是SQL Server教程的一些主要内容: 1. 数据库基础知识:介绍数据库的概念、关系型数据库模型以及SQL语言的基本语法。 2. SQL Server安装和配置:指导您如何下载、安装和配置SQL Server软件。 3. 数据库创建和管理:学习如何创建数据库、表格和其他数据库对象,以及如何管理数据库的结构和属性。 4. 数据查询和操作:了解如何使用SQL语句进行数据查询、插入、更新和删除操作。 5. 数据库安全性和权限管理:介绍如何设置用户权限、角色和访问控制,以保护数据库的安全性。 6. 数据库备份和恢复:学习如何备份和恢复数据库,以及如何处理数据丢失或损坏的情况。 7. 性能优化和调优:了解如何优化数据库的性能,包括索引设计、查询优化和服务器配置等方面的技巧。 8. 高级功能和扩展:探索SQL Server的高级功能,如存储过程、触发器、视图、事务处理和复制等。 如果您想开始学习SQL Server,可以参考Microsoft官方文档、在线教程或购买相关的书籍。同时,还可以通过实践和解决实际问题来提升您的SQL Server技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值