我在同一台服务器上有两个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
来自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进行的任何更改”没有更改。
—
奥尔加·索森尼赫
我会再次运行测试,但是在测试时关闭被动实例。测试完成后,2012实例可能正在运行检查点或其他异步过程,这会占用2016实例的资源。
—
Nabil Becker
同样,两个实例都应该完全打补丁,因此SQL 2016 SP 2 CU 2和SQL 2012 SP4 + GDR(support.microsoft.com/en-us/help/4057116/…)
—
David Browne-Microsoft
同样,在没有显式事务的情况下,这也只是测试刷新日志文件需要多长时间。
—
David Browne-微软