Почему T-SQL в SSMS работает быстрее, когда заключен в явную транзакцию - PullRequest
1 голос
/ 30 октября 2019

Запрос просто вставляет одно и то же значение '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. То, что я имел в виду под «неявной транзакцией» выше, это просто отсутствие явной транзакции.

1 Ответ

6 голосов
/ 30 октября 2019

SQL-сервер должен защищаться (запись на диск или в кэш с защитой питания) при фиксации транзакции. Когда вы используете неявный trx, у вас есть 1000 trx из-за цикла, и SQL должен сделать 1000 ios для журнала trx.

Когда вы упаковываете их в один trx, sql просто нужно сделать несколько ios (зависит от буфера журнала trx) для журнала trx. ТАК производительность лучше.

...