ฉันมี 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)
ฉันสร้างฐานข้อมูลใหม่บนทั้งสองอินสแตนซ์ในโฟลเดอร์ดิสก์เดียวกัน พารามิเตอร์ Autogrowth เหมือนกัน
ตัวเลือกสถิติอัตโนมัติและการอัปเดตอัตโนมัติถูกปิด
จากนั้นฉันได้ทำการทดสอบโดยมีใบมีด 10,000 อันเข้าไปในกอง:
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
เวลาทดสอบเฉลี่ย
- 2555 - 530 มิลลิวินาที
- 2559 - 600 ms
ดังนั้น 2559 จะช้ากว่าประมาณ 11%
- จากนั้นฉันทำการติดตาม SQL Profiler ด้วยผลลัพธ์ที่บันทึกไว้ในตารางเพื่อดูระยะเวลาการแทรกครั้งเดียวในหน่วยไมโครวินาที
ผล 2
ฮิสโตแกรมของระยะเวลาการแทรกครั้งเดียวปี 2012 เทียบกับปี 2559:
การเติบโตของบันทึกการทำธุรกรรมจาก sys.dm_io_virtual_file_stats คือ:
- 2012 - 5174784 ไบต์
- 2016 - 5171200 ไบต์
ในระหว่างการทดสอบทั้งสองกรณีจะเริ่มขึ้น แต่มีการทดสอบหนึ่งครั้งทำงานที่หนึ่งครั้งในแต่ละครั้ง ฉันได้จัดสรร RAM 8Gb ต่ออินสแตนซ์แล้ว แผนแบบสอบถามเหมือนกัน มันน่าสนใจที่จะเรียกใช้แต่ละอินสแตนซ์ในกล่องของมันเอง แต่อาจเป็นหนึ่งในเครื่องที่ดีกว่าเพราะที่นี่เราไม่มีฮาร์ดแวร์และความแตกต่างที่ซ่อนเร้น
คำถาม
- ทำไมปี 2559 ถึงช้ากว่า
- ใครบางคนอาจทำซ้ำการทดสอบนี้