Sql server 为什么SSM中的T-SQL在封装在显式事务中时运行得更快

Sql server 为什么SSM中的T-SQL在封装在显式事务中时运行得更快,sql-server,tsql,transactions,ssms,Sql Server,Tsql,Transactions,Ssms,查询只是将相同的值“hello”插入表1000次 当此查询在begin tran和commit tran中的显式事务包装中运行时,它会立即运行。但是,如果begin tran和commit tran语句被注释掉,则大约需要8秒才能完成 谁能解释一下吗 请参见下面的查询+结果: 明确的: /*------------------------ drop table Test create table Test (Name varchar(10)) begin tran set nocou

查询只是将相同的值“hello”插入表1000次

当此查询在begin tran和commit tran中的显式事务包装中运行时,它会立即运行。但是,如果begin tran和commit tran语句被注释掉,则大约需要8秒才能完成

谁能解释一下吗

请参见下面的查询+结果:

明确的:

/*------------------------
drop table Test

create table Test (Name varchar(10))

begin tran
    set nocount on
    declare @i int = 1000

    select 'START: ', getdate() -- trick to get row title printed

    while (@i > 0)
    begin
        insert into Test (Name)
            select 'hello'
        set @i = @i - 1
    end

    select 'END: ', getdate() -- trick to get row title printed
    commit tran
------------------------*/

START:  2019-10-30 17:50:54.283  
END  :  2019-10-30 17:50:54.313  
隐含的:

/*------------------------
drop table Test

create table Test (Name varchar(10))

--begin tran
set nocount on
declare @i int = 1000

select 'START: ', getdate() -- trick to get row title printed

while (@i > 0)
begin
    insert into Test (Name)
        select 'hello'
    set @i = @i - 1
end

select 'END: ', getdate() -- trick to get row title printed
--commit tran
------------------------*/

START:  2019-10-30 17:51:48.203  
END  :  2019-10-30 17:51:56.520  
编辑:
在我的连接设置中,IMPLICIT_TRANSACTIONS=OFF。上面我所说的隐式事务只是缺少显式事务。

提交事务时,SQL server需要加强对磁盘的写入或受电源保护的缓存。如果您使用隐式trx,那么由于循环,您有1000个trx,并且SQL需要为trx日志执行1000个ios


当您将它们包装在一个trx中时,sql只需要执行几个ios,这取决于trx日志的trx日志缓冲区。因此性能更好。

在提交事务时,SQL server需要加强对磁盘的写入或受电源保护的缓存。如果您使用隐式trx,那么由于循环,您有1000个trx,并且SQL需要为trx日志执行1000个ios



当您将它们包装在一个trx中时,sql只需要执行几个ios,这取决于trx日志的trx日志缓冲区。所以性能更好。

对我来说,这两个都几乎是瞬间的。您使用的是什么版本的SQL Server?我使用的是SQL Server 2014。@Isaac,Microsoft SQL Server 2014 SP2-GDR KB4505217-12.0.5223.6 X64 2019年5月26日20:36:50版权所有c Microsoft Corporation Standard Edition 64位Windows NT 6.3 Build 9600:您一致地得到了这些结果吗?@Isaac是,它在8-9秒之间。你可以通过在每个测试之前设置统计信息IO,time ON来检查实际的CPU时间和IO;可能一个批处理只是在等待另一个操作,但实际执行时间比看起来要近。无论如何,值得一看。对我来说,这两样东西几乎都是瞬间的。您使用的是什么版本的SQL Server?我使用的是SQL Server 2014。@Isaac,Microsoft SQL Server 2014 SP2-GDR KB4505217-12.0.5223.6 X64 2019年5月26日20:36:50版权所有c Microsoft Corporation Standard Edition 64位Windows NT 6.3 Build 9600:您一致地得到了这些结果吗?@Isaac是,它在8-9秒之间。你可以通过在每个测试之前设置统计信息IO,time ON来检查实际的CPU时间和IO;可能一个批处理只是在等待另一个操作,但实际执行时间比看起来要近。无论如何,值得一看。有没有办法验证这个?不知道如何验证。但是您可以在谷歌上搜索sql server事务日志强化,您应该可以找到很多关于该技术的文章details@Sumith这就是它的工作原理。循环中的每个插入必须是单个原子事务。为了使其工作,它必须为每个插入使用一个事务。您的显式事务代码在单个事务中执行1000次插入。同意。实际上,进一步的阅读似乎揭示了这个问题本身存在一些技术上的矛盾。我在连接中有隐式\u事务=关闭。ie技术上的隐式事务与我在问题中暗示的不同。@Sumith,缺少隐式事务就是自动提交,意思是每个语句本身就是一个事务。这与IMPLIT事务不同,IMPLIT事务启动一个事务,该事务可以跨越多个语句,并且必须明确提交。是否有方法验证此问题?不确定如何验证此问题。但是您可以在谷歌上搜索sql server事务日志强化,您应该可以找到很多关于该技术的文章details@Sumith这就是它的工作原理。循环中的每个插入必须是单个原子事务。为了使其工作,它必须为每个插入使用一个事务。您的显式事务代码在单个事务中执行1000次插入。同意。实际上,进一步的阅读似乎揭示了这个问题本身存在一些技术上的矛盾。我在连接中有隐式\u事务=关闭。ie技术上的隐式事务与我在问题中暗示的不同。@Sumith,缺少隐式事务就是自动提交,意思是每个语句本身就是一个事务。这与隐式事务不同,隐式事务启动一个事务,该事务可以跨越多个语句,并且必须明确提交。