Ich habe keine Ideen mehr und bitte um Ihre Hilfe. Ich habe ein seltsames Problem, für das ich keine Ursache finden kann, egal wie oft ich im Internet suche.
Ich habe zwei Laptops:
11: Festplatte und Kingston HyperX Fury SATA-III SSD (240G)
l2: Festplatte und Samsung 960 evo, nvme SSD (500G)
Und ich habe eine Prozedur zum Testen der Leistung der Datenbank, die 3 verschiedene Tabellen in Zahlen von 10.000 und 100.000 einfügt, auswählt und löscht.
l2 wurde nach l1 gekauft und ich habe versucht, alles, was ich auf l1 hatte, auf l2 zu migrieren, einschließlich der Datenbanken. Nachdem ich das Performance-Verfahren ausgeführt hatte, bemerkte ich etwas Seltsames: l2 nahm viel mehr in Anspruch als l1. Ein Beispiel ist das Einfügen von 10.000 Zeilen in eine Tabelle. L1 würde 1 Sekunde dauern, während l2 28 Sekunden dauern würde. Natürlich hatte ich nicht die Geduld, die 100.000 Einfügungen auf l2 auszuprobieren, wobei auf l1 nur 40 Sekunden dauern würden.
Also habe ich versucht, die Wurzel der Ursache zu finden. Geöffneter Task-Manager (ich verwende Windows 10), Registerkarte Leistung, und festgestellt, dass die SSD beim Einfügen nur mit 200 KBit / s schreibt, während die SSD von l1 mit 4,4 MBit / s schreibt.
Natürlich habe ich die Möglichkeit genutzt, dass die SSD defekt sein könnte, also habe ich 3 Benchmarks verwendet, um zu sehen. Das erste, das ich verwendete, war Samsung Magician, CrystalDiskMark und AS SSD Benchmark. Alle diese 3 Benchmarks gaben an, dass es kein Problem gibt und meine SSD mit der Geschwindigkeit arbeitet, mit der sie funktionieren sollte. Ich muss beachten, dass alle meine Treiber auf dem neuesten Stand sind und die Firmware der SSD die neueste ist. Ich habe versucht, den SQL Server neu zu installieren. Ich habe versucht, die Editionen von Enterprise auf Developer zu ändern (Developer ist derjenige, den ich auf l1 verwende).
Eine andere Sache, die ich versuchte, war das Trennen der Datenbank. Verschieben Sie es auf das andere Laufwerk und bringen Sie es wieder an. Um das herauszufinden, funktioniert es besser als auf der SSD.
Die Ergebnisse für jede Leistungsprüfung (10.000 Einfügungen + Auswählen + Löschen): (IncepeLa = StartsAt, SeIncheieLa = EndsAt)
Am Ende stellt sich die Frage: Warum schneidet SQL Server auf einem Teil, der einer Festplatte überlegen sein soll, deutlich schlechter ab?
Bearbeiten:
Bearbeiten 2:
Ich habe ein weiteres Bild hinzugefügt, das eine interessante Sache in Bezug auf die Standzeit zeigt.
Hässlicher Code:
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;
Die Funktionen addfields sollen mit einer Weile Felder für die Tabellen hinzufügen.
Bearbeiten 3 : Um die Sache klarer zu machen, geht es nicht um den verwendeten Algorithmus. Ich werde es demonstrieren, indem ich eine Weile mache, in der ich 10.000 Werte hinzufüge. Einmal, wenn sich die Datenbank auf der SSD befindet und einmal, wenn sich die Datenbank auf der Festplatte befindet, verwende ich für diesen Test nur l2.
Ein Bild, das aus beiden besteht, weil es das letzte ist, das ich posten kann (ich habe nicht 10 Ruf, mehr als 8 Bilder zu posten)
Wie zu bemerken ist, werden die Einfügungen in 2 Sekunden ausgeführt, wenn sich die Datenbank auf der Festplatte befindet, während sie auf der SSD in 27 Sekunden eingefügt wird.