Tôi không có ý tưởng, vì vậy tôi đang nhờ bạn giúp đỡ. Tôi có một vấn đề kỳ lạ mà tôi không thể tìm ra nguyên nhân cho dù tôi có tìm kiếm bao nhiêu trên internet.
Điều đó là, tôi có hai máy tính xách tay:
l1: Ổ cứng và SSD Kingston HyperX Fury SATA-III (240G)
l2: Ổ cứng và ổ SSD Samsung 960 evo, nvme (500G)
Và tôi có một quy trình để kiểm tra hiệu năng của cơ sở dữ liệu, trong đó chèn, chọn và xóa từ 3 bảng khác nhau, với số lượng 10.000 và 100.000.
l2 được mua sau l1 và tôi đã cố gắng di chuyển mọi thứ tôi có trên l1 sang l2, bao gồm cả cơ sở dữ liệu. Sau khi chạy thủ tục hiệu suất tôi nhận thấy một điều kỳ lạ, l2 đang chiếm nhiều hơn l1. Một ví dụ là việc chèn 10.000 dòng trong một bảng, l1 sẽ mất 1 giây, trong đó l2 sẽ mất 28 giây. Tất nhiên, tôi không đủ kiên nhẫn để thử 100.000 lần chèn vào l2, trong đó trên l1 sẽ chỉ mất 40 giây.
Vì vậy, tôi đã cố gắng tìm ra nguyên nhân của nguyên nhân. Trình quản lý tác vụ đã mở (Tôi đang sử dụng Windows 10), tab hiệu suất và phát hiện ra rằng, khi sắp chèn, SSD chỉ ghi với tốc độ 200kb / giây, trong khi SSD của l1 ghi 4,4 MB / s.
Tất nhiên, tôi đã có khả năng SSD có thể bị lỗi nên tôi đã sử dụng 3 điểm chuẩn để xem. Cái đầu tiên tôi sử dụng là Samsung Magician, CrystalDiskMark và AS SSD Benchmark. Tất cả 3 điểm chuẩn đó đều cho biết không có vấn đề gì và SSD của tôi đang hoạt động với tốc độ mà nó sẽ hoạt động. Tôi phải lưu ý rằng tất cả các trình điều khiển của tôi đã được cập nhật và phần sụn của ssd là bản mới nhất. Tôi đã thử cài đặt lại SQL Server, tôi đã thử thay đổi các phiên bản từ Enterprise sang Developer (Nhà phát triển là phiên bản tôi sử dụng trên l1).
Một điều khác tôi đã cố gắng là, tách cơ sở dữ liệu. di chuyển nó sang ổ đĩa khác và gắn nó trở lại. Để tìm ra điều đó, nó hoạt động tốt hơn trên ssd.
Kết quả cho mỗi lần kiểm tra hiệu suất (10.000 lần chèn + chọn + xóa): (IncepeLa = StartsAt, SeIncheieLa = EndsAt)
Cuối cùng, câu hỏi là ... Tại sao SQL Server hoạt động kém hơn đáng kể trên một mảnh được cho là vượt trội so với ổ cứng?
Biên tập:
Chỉnh sửa 2:
Tôi đã thêm một hình ảnh khác cho thấy một điều thú vị liên quan đến thời gian gian hàng.
Mã xấu:
declare @id_test int
declare @name_test nvarchar(50)
declare ctest cursor
for
select CodTest, Nume from Teste;
open ctest
fetch next from ctest into @id_test, @name_test;
while @@FETCH_STATUS = 0 begin
if @name_test = 'insert'
-- @name_test TesteTabele
begin
declare @t_t_cte int
declare @t_t_cta int
declare @t_t_nr int
declare @t_t_p int
insert into RulariTeste (Descriere, IncepeLa, SeIncheieLa) values ('Add in table', SYSDATETIME(), null);
declare c_t_t cursor
for
select * from TesteTabele
open c_t_t
fetch next from c_t_t into @t_t_cte, @t_t_cta, @t_t_nr, @t_t_p
while @@FETCH_STATUS = 0 begin
insert into RulariTesteTabele (CodRulareTest, CodTabel, IncepeLa, SeIncheieLa) values (@t_t_cte, @t_t_cta, SYSDATETIME(), 0);
exec('addfields' + @t_t_cta + ' ' + @t_t_nr);
update RulariTesteTabele set SeIncheieLa = SYSDATETIME() where CodRulareTest = @t_t_cte and CodTabel = @t_t_cta;
fetch next from c_t_t into @t_t_cte, @t_t_cta, @t_t_nr, @t_t_p
end
close c_t_t
deallocate c_t_t
update RulariTeste set SeIncheieLa = SYSDATETIME() where @id_test = CodRulareTest;
end
else if @name_test = 'select'
-- @name_test TesteViewuri
begin
declare @t_v_ct int
declare @t_v_cv int
insert into RulariTeste (Descriere, IncepeLa, SeIncheieLa) values ('Select view', SYSDATETIME(), null);
declare c_t_v cursor
for
select * from TesteViewuri
open c_t_v
fetch next from c_t_v into @t_v_ct, @t_v_cv
while @@FETCH_STATUS = 0 begin
insert into RulariTesteViewuri (CodRulareTest, CodView, IncepeLa, SeIncheieLa) values (@t_v_ct, @t_v_cv, SYSDATETIME(), 0);
select * from (select Nume from Viewuri where CodView = @t_v_cv) as aview;
update RulariTesteViewuri set SeIncheieLa = SYSDATETIME() where CodRulareTest = @t_v_ct and CodView = @t_v_cv;
fetch next from c_t_v into @t_v_ct, @t_v_cv
end
close c_t_v
deallocate c_t_v
update RulariTeste set SeIncheieLa = SYSDATETIME() where @id_test = CodRulareTest;
end
else if @name_test = 'delete'
begin
insert into RulariTeste (Descriere, IncepeLa, SeIncheieLa) values ('Delete from table', SYSDATETIME(), null);
delete from topic_follows;
delete from topics;
delete from users;
update RulariTeste set SeIncheieLa = SYSDATETIME() where CodRulareTest = (select TOP(1) CodRulareTest from RulariTeste order by CodRulareTest desc);
end
fetch next from ctest into @id_test, @name_test
end
close ctest;
deallocate ctest;
Các hàm addfields được cho là thêm các trường cho các bảng, trong một thời gian.
Chỉnh sửa 3 : Để làm cho vấn đề rõ ràng hơn, đó không phải là về thuật toán được sử dụng. Tôi sẽ chứng minh bằng cách thực hiện một lúc trong đó tôi thêm 10.000 giá trị. Một lần khi db ở trên SSD và một lần khi db ở trên ổ cứng, tôi sẽ chỉ sử dụng l2 cho thử nghiệm này.
Một hình ảnh bao gồm cả hai, bởi vì đó là hình ảnh cuối cùng tôi có thể đăng (Tôi không có 10 danh tiếng để đăng hơn 8 hình ảnh)
Như có thể nhận thấy, khi db ở trên ổ cứng, nó sẽ thực thi các thao tác chèn trong 2 giây, trong khi đó, trên ổ SSD, nó sẽ chèn chúng trong 27 giây.