繁体   English   中英

通过事务获得更好的性能

[英]Getting better performance with transactions

我正在使用 SQL Server Management Studio v18.5 和 SQL Server 12 运行一些简单的测试,以测试可能迁移到 Identity 列或使用序列,因为在使用INSERT INTO(...); SELECT MAX(ID) + 1 FROM dbo.Test (...); INSERT INTO(...); SELECT MAX(ID) + 1 FROM dbo.Test (...); 之类的。

我的交易表现越来越好,但我不明白,也找不到原因。

当我只运行 select 并运行事务中的内容时,速度存在差异。

这是我正在使用的代码:


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 (...); 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 服务器必须在每次 INSERT 后刷新日志文件。 这是一个物理 IO 并且您的 session 在每次 INSERT 之后等待日志被硬化到磁盘。

使用事务 SQL 服务器不必在每次插入后刷新日志。 相反,日志是在后台异步写入的,您只需等待事务的最后一条日志记录在commit transaction时被硬化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM