SQL Server 2016 vs 2012插入性能


14
  • 我在同一台服务器上有两个SQL Server实例:

    • Microsoft SQL Server 2012(SP1)-11.0.3000.0(X64)标准版(64位)
    • Microsoft SQL Server 2016(SP1-CU5)(KB4040714)-13.0.4451.0(X64)企业版(64位)
  • 两个实例上的sp_configure结果相同(新的2016选项除外)。

  • 我已经在同一磁盘文件夹上的两个实例上创建了新数据库。自动增长参数是相同的。

  • 自动创建和自动更新统计信息选项已关闭。

  • 然后,我对堆中的10000个插入进行了测试:

set nocount on
go

create table dbo.TestInsert ( i int not null, s varchar(50) not null )

declare @d1 datetime, @d2 datetime, @i int
set @d1 = getdate() 
set @i = 1

while @i <= 10000
begin
  insert into dbo.TestInsert ( i, s ) select @i, replicate( 'a', 50 )
  set @i = @i + 1
end

set @d2 = getdate()
select datediff(ms, @d1, @d2)
drop table dbo.TestInsert

结果1

平均考试时间

  • 2012-530毫秒
  • 2016年-600毫秒

因此,2016年要慢11%。

  • 然后,我进行了SQL事件探查器跟踪,并将结果保存到表中,以查看单个插入持续时间(以微秒为单位)。

结果2

一次插入持续时间 2012年与2016年的直方图: 在此处输入图片说明

来自sys.dm_io_virtual_file_stats的事务日志的增长为:

  • 2012-5174784字节
  • 2016-5171200字节

在这些测试期间,两个实例都将启动。但是每次只能在一个实例上运行一个测试。我为每个实例分配了8Gb RAM。查询计划是相同的。在自己的盒子上运行每个实例会很有趣。但是一台机器可能会更好,因为这里我们没有硬件和环境方面的隐藏差异。

问题

  • 为什么2016年会变慢?
  • 有人可以复制此测试吗?

在SQL Server 2016上使用TF 692进行任何更改吗?blogs.msdn.microsoft.com/sql_server_team/...
乔Obbish

“在SQL Server 2016上使用TF 692进行的任何更改”没有更改。
奥尔加·索森尼赫

1
我会再次运行测试,但是在测试时关闭被动实例。测试完成后,2012实例可能正在运行检查点或其他异步过程,这会占用2016实例的资源。
Nabil Becker

1
同样,两个实例都应该完全打补丁,因此SQL 2016 SP 2 CU 2和SQL 2012 SP4 + GDR(support.microsoft.com/en-us/help/4057116/…
David Browne-Microsoft

3
同样,在没有显式事务的情况下,这也只是测试刷新日志文件需要多长时间。
David Browne-微软

Answers:


1

显然,在同一服务器上具有完全相同的版本非常困难,但是...希望我的结果对您有所帮助。我有两台配置Windows Server 2012 R2 Standard的计算机。不幸的是,它们没有相同的硬件,但是却相似:

  1. 机器1(SQL Server 2016)

    • 处理器:Intel(R)Xeon(r)CPU X5650 @ 2.67GHz
    • Microsoft SQL Server 2016(RTM)-13.0.1601.5(X64)2016年4月29日23:23:58版权所有(c)Windows Server 2012 R2 Standard 6.3(Build 9600:)上的Microsoft Corporation Standard Edition(64位)(Hypervisor)
  2. 机器2(SQL Server 2012)

    • 处理器:Intel(R)Xeon(R)CPU E5-2667 0 @ 2.9 GHz
    • Microsoft SQL Server 2012-11.0.5058.0(X64)2014年5月14日18:34:29版权所有(c)Windows NT 6.3上的Microsoft Corporation标准版(64位)(内部版本9600 :)(管理程序)

我在两台计算机上运行了5次与您提供的脚本相同的脚本,并获得了以下平均值:

  • 2012:9961
  • 2016年:8971

您获得的几乎相反的结果。无论如何,正如您所看到的,我的2012年机器具有更好的处理器,但是通常显示出差异的硬盘是相同的。因此,就我的情况而言,即使2012年有更好的资源,也要慢一些。

(对不起,请再次检查,我的第一个版本有一些重要的错误)


-2

您可以添加(TABLOCK) 提示以启用最少日志记录吗?应用此提示后有什么区别?

INSERT INTO t_heap WITH (TABLOCK) 
SELECT * 
FROM t_source
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.