SQL Server SSD langsame Leistung

7

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.

l2

Geben Sie hier die Bildbeschreibung ein

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)

l2 auf SSD: Geben Sie hier die Bildbeschreibung ein

l2 auf der Festplatte: Geben Sie hier die Bildbeschreibung ein

l1 auf SSD: Geben Sie hier die Bildbeschreibung ein

Am Ende stellt sich die Frage: Warum schneidet SQL Server auf einem Teil, der einer Festplatte überlegen sein soll, deutlich schlechter ab?

Bearbeiten:

Geben Sie hier die Bildbeschreibung ein

Bearbeiten 2:

Ich habe ein weiteres Bild hinzugefügt, das eine interessante Sache in Bezug auf die Standzeit zeigt. Geben Sie hier die Bildbeschreibung ein

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) Geben Sie hier die Bildbeschreibung ein

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.

Tigrex
quelle

Antworten:

7

Wenn Sie ein Leistungsproblem haben, fragen Sie zunächst: "Was ist mein Top-Wartetyp?" Wartestatistiken zeigen an, worauf SQL Server wartet.

Ich mag es, Wartezeiten mit sp_BlitzFirst zu messen (Haftungsausschluss: Ich habe es geschrieben). Es ist ein kostenloses Open-Source-Skript mit MIT-Lizenz, das Sie aufrufen können, um eine Probe Ihrer Wartezeiten wie folgt zu erstellen :

EXEC sp_BlitzFirst @Seconds = 60, @ExpertMode = 1;

Das wird eine 60-Sekunden-Probe Ihrer Wartezeiten nehmen. Veröffentlichen Sie einen Screenshot des Abschnitts mit den Wartestatistiken, und wir können möglicherweise erklären, worauf der Server wartet.

Update: Ihr hinzugefügter Screenshot zeigt 2 Sekunden Wartezeit von WRITELOG innerhalb von 60 Sekunden. Grundsätzlich wartet Ihr SQL Server nicht so lange. Ich vermute, dass Ihre simulierte Arbeitslast eine serielle Singleton-Aktivität umfasst: Arbeiten an jeweils einer Zeile von jeweils nur einem Thread in einem Tool zur Lastgenerierung. Dies ist keine großartige Möglichkeit, Workloads zu simulieren. Sie sollten ein Tool zum Generieren von Lasten mit mehreren Threads verwenden, bei dem viele Aktivitäten gleichzeitig ausgeführt werden und mehr als eine Aktivitätsreihe gleichzeitig ausgeführt wird.

Brent Ozar
quelle
Ich habe keine Ahnung, wie ich es exportieren soll, um es hier zu veröffentlichen. Ich habe versucht, die Abfrage in einer .rpt-Datei zu speichern, aber es sieht schwer aus, etwas zu verstehen. Wie auch immer, ich werde meinen Beitrag damit aktualisieren.
Tigrex
Ich habe meine Antwort auf so viele Arten wie möglich aktualisiert. Wenn ich mehr tun sollte, um es verständlicher zu machen, sag es mir bitte.
Tigrex
Ich verstehe, dass dies höchstwahrscheinlich nicht der Weg ist, um die Leistung der Datenbank zu testen, da meine Art, dies zu tun, von der Universität vorgegeben wird. Und Sie haben Recht, es funktioniert eine Zeile auf einmal, weil ich Zeiger verwende. Was ich nicht erklären kann, ist, warum die Festplatte besser abschneidet als eine SSD und eine schwächere SSD viel besser als die "beste SSD 2016" (oder wie auch immer sie genannt wurde). Ich werde meine Antwort mit dem von mir verwendeten Algorithmus aktualisieren (Vorsicht, es sollte nie wiederverwendet werden, ich bin in der Lernphase) und wahrscheinlich einem relevanten Screenshot des durchschnittlichen Standes, den ich seltsam fand. (1s Stall)
Tigrex
Ich meinte Cursor nicht Zeiger, meine schlechte.
Tigrex
1
Richtig, aber jetzt geht dies weit über eine Q & A-Website hinaus. Sie untersuchen jetzt die Gültigkeit Ihrer Testmethode sowie die Leistung Ihrer Hardware. Als SQL Server-Typ kann ich Ihnen nur sagen, dass Sie den Testspeicher nicht mit einem Cursor laden. Es ist, als würde man versuchen, die Geschwindigkeit eines Autos zu messen, indem man es mit Wassermelonen belädt.
Brent Ozar
4

Okay, ich habe es gelöst. Nachdem ich mich umgesehen und viele verschiedene Dinge ausprobiert hatte, ging es endlich zu Ende.

Ich schrieb in der ursprünglichen Frage, dass "alle meine Fahrer auf dem neuesten Stand sind", was aussieht, als wäre es eine Idiot-Lüge von mir. Ich entschuldige mich dafür, ich habe nur die Firmware aktualisiert und hatte Visionen, auch den Treiber zu aktualisieren.

Anscheinend wurde alles durch die Installation des neuesten Treibers von der ursprünglichen Website von Samsung gelöst. IMHO habe ich keine so drastischen Änderungen gegenüber einem Fahrerwechsel erwartet.

Der Treiber, den ich zuvor hatte, war, wie im Tool "Samsung Magician" unter dem NVMe-Treiber von Microsoft gezeigt. Nach der Installation des Treibers wird Samsung angezeigt.

Ich entschuldige mich erneut für die Fehlinformationen und danke Brent Ozar für die Unterstützung, ohne die ich diese Suche lange aufgegeben und mich nur "darum gekümmert" hätte.

Tigrex
quelle