sqlserver为何事务提交反而更快?

2020-04-28 10:03发布

问题:

begin
    print CONVERT(varchar(100), GETDATE(), 21)
    declare @i int
    set @i=1000000
    while(@i>0)
    begin
        begin tran
            insert into [dbo].[TextMessage](info)values(CAST(@i as varchar))
            insert into [dbo].[Course](Name,DisplayOrder)values(CAST(@i as varchar),@i)
        commit
        set @i=@i-1
    end 
    print CONVERT(varchar(100), GETDATE(), 21)
end

1W行数据提交时间
2015-07-25 11:00:17.803
2015-07-25 11:00:19.067

2

10W数据提交时间
2015-07-25 11:01:33.893
2015-07-25 11:01:45.960
12

100W数据提交时间
2015-07-25 11:05:37.653
2015-07-25 11:07:45.390
2:08

begin
    print CONVERT(varchar(100), GETDATE(), 21)
    declare @i int
    set @i=1000000
    while(@i>0)
    begin
        insert into [dbo].[TextMessage](info)values(CAST(@i as varchar))
        insert into [dbo].[Course](Name,DisplayOrder)values(CAST(@i as varchar),@i)
        set @i=@i-1
    end 
    print CONVERT(varchar(100), GETDATE(), 21)
end

1W行数据提交时间
2015-07-25 11:01:00.263
2015-07-25 11:01:05.797

5

10W数据提交时间
2015-07-25 11:02:14.293
2015-07-25 11:02:39.437
25

100W数据提交时间
2015-07-25 11:09:33.933
2015-07-25 11:13:12.920
3:39

回答1:

我说下我的理解吧。首先这两个没有数量级的差别,可以认为基本相同,为什么说相同呢。因为你这里用事务也没用事务区别不大,因为没有其它来竞争资源。反正只有一个连接在操作这两个表,没有其它的操作。

其次,在这种没有其它操作的情况下,用事务只提交一次事务,如果不用事务反正会提交两次,所以感觉应该是用一个事务还就稍微快一点。

下面是我做的测试两组数据

-- 1W 1 4450
-- 1W 2 4583

-- 有其它操作
-- 1W 1 4550 --10ms间隔
-- 1W 2 4636 --无间隔
-- 1W 3 5116 --无间隔事务
-- 1W 4 5290 --10ms间隔事务

-- 1W 1 4986 -- 一条记录(没有开其它连接,只是把操作变成一条insert,也就是事务中只有一条)

---------------------------------------上面这一组是事务操作

--1W 1 4790
--1W 2 4930

--有影响 (另外开连接操作两个表)
-- 1W 1 5193 --10ms间隔
-- 1W 2 6356 --无间隔
-- 1W 3 8733 --无间隔事务
-- 1W 4 6260 --10ms间隔事务

-- 1W 1 2863 -- 一条记录(没有开其它连接,只是把操作变成一条insert)

--------------------------------------这一组是非事务操作

1.先看前面两次测试,确实事务效果还会好一些。这里就是上面说的两条分开操作可能提交两次,会有一些处理是两次。而事务有些处理是一次完成的,所以反而更快。再结合最后一条记录看,把事务里面变成一条,两个比较可以看出事务时间更长,说明事务做了其它的一些处理,所以更慢。

2.看下面4次测试,在外部有其它操作表的时候,我是插入这两个表记录可以看出 事务的情况在有其它的操作情况下,时间是越来越长。而非事务操作的影响就不一样了,先是变长,然后变小,说明大事务对这种无事务操作的影响会越来越小。虽说总的时间事务还是要短一些,但是这里同我的测试数据有关,比如再复杂一些,主要这里是用来看一个趋势。

 



回答2:

你没有加事务,可能SQL Sever自动加了事务(autocommit)。

建议通过 SET IMPLICIT_TRANSACTIONS OFF 关闭自动事务试试。