sql—获得更好的事务性能

j8ag8udp  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(410)

我正在使用SQLServerManagementStudio v18.5和SQLServer12运行一些简单的测试,以测试在使用诸如 INSERT INTO(...); SELECT MAX(ID) + 1 FROM dbo.Test (...); 诸如此类。
我在事务处理方面的表现越来越好,但我不明白,也找不到原因。
当我只选择并运行事务中的内容时,速度会有所不同。
以下是我使用的代码:

  1. CREATE TABLE [dbo].[TEST_MIGRATION] (
  2. [ID] INT NOT NULL,
  3. [Nome] INT NOT NULL,
  4. [Pass] INT NOT NULL
  5. );

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

  1. BEGIN TRAN
  2. DECLARE @i int = 1;
  3. WHILE @i < 10000
  4. BEGIN
  5. SET @i = @i + 1;
  6. INSERT INTO TEST_MIGRATION (ID, Nome, Pass)
  7. VALUES ((SELECT MAX(ID) + 1 FROM TEST_MIGRATION), @i, @i + 20);
  8. END
  9. --COMMIT TRAN
  10. ROLLBACK TRAN

这次的结果是:
[带事务回滚]
结果测试1:
00:01:16
结果测试2:
00:02:11
[使用事务提交]
结果测试1:
00:02:28
顺序:

  1. DECLARE @ID INT = (SELECT ISNULL(MAX(ID) + 1, 0) FROM TEST_MIGRATION);
  2. EXEC ('
  3. CREATE SEQUENCE TEST_MIGRATION_ID_Seq
  4. START WITH ' + @ID +
  5. ' INCREMENT BY 1;'
  6. )
  7. ;
  8. ALTER TABLE TEST_MIGRATION
  9. ADD CONSTRAINT df_TEST_MIGRATION_ID
  10. DEFAULT (NEXT VALUE FOR dbo.TEST_MIGRATION_ID_Seq) FOR ID
  11. ;
  12. BEGIN TRAN
  13. DECLARE @i int = 1;
  14. WHILE @i < 10000
  15. BEGIN
  16. SET @i = @i + 1;
  17. INSERT INTO TEST_MIGRATION (Nome, Pass)
  18. VALUES (@i, @i + 20);
  19. END
  20. 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
使用标识列:

  1. CREATE TABLE [dbo].[TEST_MIGRATION_IDENTITY] (
  2. [ID] INT NOT NULL IDENTITY(1, 1),
  3. [Nome] INT NOT NULL,
  4. [Pass] INT NOT NULL
  5. );
  6. BEGIN TRAN
  7. DECLARE @i int = 1;
  8. WHILE @i < 10000
  9. BEGIN
  10. SET @i = @i + 1;
  11. INSERT INTO TEST_MIGRATION_IDENTITY(Nome, Pass)
  12. VALUES (@i, @i + 20);
  13. END
  14. 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
热释光;dr:我使用事务获得了更好的性能,而不仅仅是查询块。对此有何解释?

iih3973s

iih3973s1#

与单独使用查询块相比,使用事务可以获得更好的性能
如果没有事务,sql server必须在每次插入后刷新日志文件。这是一个物理io,您的会话在每次插入后都会等待日志被硬化到磁盘。
对于事务,sql server不必在每次插入后刷新日志。相反,日志是在后台异步写入的,您只需等待事务的最后一条日志记录在 commit transaction .

相关问题