同じサーバーに2つのSQL Serverインスタンスがあります。
- Microsoft SQL Server 2012(SP1)-11.0.3000.0(X64)Standard Edition(64ビット)
- Microsoft SQL Server 2016(SP1-CU5)(KB4040714)-13.0.4451.0(X64)Enterprise Edition(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バイト
これらのテスト中に、両方のインスタンスが開始されます。ただし、1つのテストは毎回1つのインスタンスでのみ実行されます。インスタンスごとに8Gb RAMを割り当てました。クエリプランは同じです。各インスタンスを独自のボックスで実行すると興味深いでしょう。ただし、ここではハードウェアと環境の隠れた違いがないため、おそらく1台のマシンの方が適しています。
ご質問
- 2016年はなぜ遅いのですか?
- 誰かがこのテストを再現できますか?