通过事务获得更好的性能
Getting better performance with transactions
我正在 运行使用 SQL Server Management Studio v18.5 和 SQL Server 12 进行一些简单测试,以测试可能迁移到身份列或使用序列,由于大型插入的性能问题,当使用 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 (...);
:
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:我通过使用事务获得更好的性能,而不是单独使用查询块。对此有何解释?
I am geting better performance with the use of transaction, opposed to query blocks alone
没有事务SQL服务器必须在每次插入后刷新日志文件。这是一个物理 IO,您的会话在每次 INSERT 后等待日志硬化到磁盘。
使用事务 SQL 服务器不必在每次 INSERT 后刷新日志。而是在后台异步写入日志,你只需要等待事务的最后一条日志记录在commit transaction
.
被加固
我正在 运行使用 SQL Server Management Studio v18.5 和 SQL Server 12 进行一些简单测试,以测试可能迁移到身份列或使用序列,由于大型插入的性能问题,当使用 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 (...);
:
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:我通过使用事务获得更好的性能,而不是单独使用查询块。对此有何解释?
I am geting better performance with the use of transaction, opposed to query blocks alone
没有事务SQL服务器必须在每次插入后刷新日志文件。这是一个物理 IO,您的会话在每次 INSERT 后等待日志硬化到磁盘。
使用事务 SQL 服务器不必在每次 INSERT 后刷新日志。而是在后台异步写入日志,你只需要等待事务的最后一条日志记录在commit transaction
.