通过交易获得更好的性能

问题描述 投票:0回答:1

我正在使用SQL Server Management Studio v18.5和SQL Server 12运行一些简单的测试,以测试在使用INSERT INTO(...); SELECT MAX(ID) + 1 FROM dbo.Test (...);之类的策略时由于大插入而导致的性能问题,以测试是否可能迁移到Identity列或使用Sequences。等等。

我在交易中获得了更好的性能,但我不了解,也找不到原因。

[当我仅选择并运行事务中的内容时,会有速度差异。

这是我使用的代码:


CREATE TABLE [dbo].[TEST_MIGRATION] (
    [ID] INT NOT NULL,
    [Nome] INT NOT NULL,
    [Pass] INT NOT NULL
);

测试INSERT INTO(...); SELECT MAX(ID) + 1 FROM dbo.Test (...);


BEGIN TRAN

    DECLARE @i int = 1;

    WHILE @i < 10000
    BEGIN
        SET @i = @i + 1;

        INSERT INTO TEST_MIGRATION (ID, Nome, Pass)
        VALUES ((SELECT MAX(ID) + 1 FROM TEST_MIGRATION), @i, @i + 20);
    END

--COMMIT TRAN
ROLLBACK TRAN

此结果为:

[[具有事务回滚]

结果测试1:

00:01:16

结果测试2:

00:02:11

[[有交易提交]

结果测试1:

00:02:28


顺序:


DECLARE @ID INT = (SELECT ISNULL(MAX(ID) + 1, 0) FROM TEST_MIGRATION);

EXEC ('
    CREATE SEQUENCE TEST_MIGRATION_ID_Seq
    START WITH ' + @ID +
    ' INCREMENT BY 1;'
)
;

ALTER TABLE TEST_MIGRATION
ADD CONSTRAINT df_TEST_MIGRATION_ID
DEFAULT (NEXT VALUE FOR dbo.TEST_MIGRATION_ID_Seq) FOR ID
;

BEGIN TRAN

    DECLARE @i int = 1;

    WHILE @i < 10000
    BEGIN
        SET @i = @i + 1;

        INSERT INTO TEST_MIGRATION (Nome, Pass)
        VALUES (@i, @i + 20);

    END

COMMIT TRAN

此结果为:

[[具有事务回滚]

结果测试1:

00:00:01

结果测试2:

00:00:01

结果测试3:

00:00:02

[[有交易提交]

结果测试1:

00:00:01

结果测试2:

00:00:00

[[无交易]

结果测试1:

00:00:07

结果测试2:

00:00:08

结果测试3:

00:00:07


带有“身份”列:


CREATE TABLE [dbo].[TEST_MIGRATION_IDENTITY] (
    [ID] INT NOT NULL IDENTITY(1, 1),
    [Nome] INT NOT NULL,
    [Pass] INT NOT NULL
);

BEGIN TRAN

    DECLARE @i int = 1;

    WHILE @i < 10000
    BEGIN
        SET @i = @i + 1;

        INSERT INTO TEST_MIGRATION_IDENTITY(Nome, Pass)
        VALUES (@i, @i + 20);

    END

COMMIT TRAN

这些是这个的结果:

[[具有事务回滚]

结果测试1:

00:00:00

结果测试2:

00:00:00

[[有交易提交]

结果测试1:

00:00:00

结果测试2:

00:00:00

[[无交易]

结果测试1:

00:00:07

结果测试2:

00:00:07


TL; DR:与单独使用查询块相反,使用事务处理可以获得更好的性能。这是什么解释?

sql sql-server database transactions performance-testing
1个回答
1
投票
我通过使用事务获得了更好的性能,这与单独的查询块相反

没有事务,SQL Server必须在每次插入后刷新日志文件。这是一个物理IO,您的会话在每次INSERT之后等待将日志加固到磁盘。

对于事务,SQL Server不必在每次插入后刷新日志。相反,该日志是在后台异步写入的,您只需要等待事务的最后一个日志记录在commit transaction处进行加固。

© www.soinside.com 2019 - 2024. All rights reserved.