Neu SQL Server nutzt den verfügbaren Arbeitsspeicher nicht

Vitamed

Aktives Mitglied
5. Dezember 2013
8
0
Hallo Zusammen,

kennt jemand das Problem das der SQL Server (bei uns Standart 2017 2Core ) sich nicht den zur Verfügung stehenden Arbeitsspeicher nimmt (Verfügbar 80 GB RAM --> Taskmanager zeigt unter 1 GB Ram an :( )
Wir hatten bereits einen JTL Support Mitarbeiter der die Settings geprüft hat und keinen Fehler in den SQL Einstellungen finden konnte.

Unser Setting:
SQL Sever ist eine Virtuelle Maschine (Hyper-V Host Win S 2019 mit 256GB Ram) die den Arbeitspeicher fix zugewiesen hat (128GB Ram). Bei allen VM´s ist die Dynamische Speicherzuordnung aus.

Falls Ihr hierzu auch keinen Rat habt, könnt Ihr uns vielleicht eine Empfehlung für eine Fachfirma geben mit der Ihr gute Erfahrungen gemacht habt.

Vielen Dank & Viele Grüße
Firma Vitamed
 

sebjo82

Sehr aktives Mitglied
3. Juni 2021
582
167
Arbeitet die Instanz nicht vernünftig? Wenn keine Berechnungen anstehen / gecacht sind, braucht das Programm entsprechend fast keinen RAM.
Wenn keine Fehler aufkommen, passt das doch.
Meine kleine TestDB-Instanz hat im Idle auch nur 600MB reserviert
 

Scriptfarm DEV

Aktives Mitglied
7. Dezember 2018
63
17
Der Taskmanager ist schon mal nicht der richtige Weg eine genaue Auslastung des SQL Server zu ermitteln, ein schon besserer Weg wäre der jeweilige Ressourcenmonitor, sprich Performance-Counter.
Der SQL Server nimmt sich so viel Speicher wie maximal konfiguriert ist, oder an Daten im Pufferpool benötigt wird.
Ich könnte dir einiges dazu sagen, leider habe ich aber gerade nicht die nötige Zeit das detaillierter zu erörtern, da es doch schon ein etwas komplexes Thema ist, eventuell etwas später mal.
 
Zuletzt bearbeitet:

Frank Hoffmeister

Sehr aktives Mitglied
11. Mai 2014
142
28
Wie hier zu sehen, verwendet die SQL Instanz nicht den möglichen zur Verfügung stehenden Arbeitsspeicher.

Arbeitsspeichernutzung.jpg

Dafür kommt es häufiger zu Dumps aufgrund von SOS I/O Fehlern.
Da die Temp DB (8 Dateien+1 log) eine sehr hohe Auslastung hat.
In der letzten Zeit haben wir einmal wöchentlich zu 90% Sonntags oder Montags diesen Fehler im Windows Protokoll wobei sich die ndf Datei unterscheidet, je nachdem welche der 8 diesen Fehler auswirft.:
SQL Server hat einen logischen, konsistenzbasierten E/A-Fehler gefunden: Ungültige Schutzoption. Der Fehler ist beim Lesen von Seite (3:25082) in der Datenbank mit der ID 2 bei Offset 0x0000000c3f4000 in der Datei "C:\Program Files\Microsoft SQL Server\MSSQL14.JTLWAWI\MSSQL\DATA\tempdb_mssql_2.ndf" aufgetreten.
Dann ist kein Arbeiten mehr möglich solange der Server nicht neu gestartet wird und somit die Tempdbs neu erstellt werden.
Mit kein Arbeiten meine ich das man aus der Wawi geworfen wird, es manchmal bis zu 5 Minuten dauert bis irgend eine Suche reagiert, die Managementstudio Verbindung nicht möglich ist usw....
Nach einem Neustart kann es möglich sein das er in kürzester Zeit wieder nicht mehr reagiert oder aber auch bis zum nächsten Montag problemlos läuft.
Da dieser Fehler schon länger ist, habe ich inzwischen einen neuen Server (echt kein VM) installiert, bin von SQL Server 2012 auf 2017 , trotzdem taucht es fast wöchentlich auf.
Parallelitätseinstellungen, usw. schon in die unterschiedlichsten Richtungen getestet, kommt immer wieder.
Meine letzte Hoffnung ist eine M2 SSD für die tempdb und logs um ihm noch mehr Speed zu geben damit die I/O Fehler nicht mehr kommen. Aber meiner Meinung nach liegt es am nicht verwendeten Arbeitsspeicher.
SP_Blitz bringt auch nicht wirklich eine Erkenntnis außer den Waits. Verschiedenste Konfigurationsvarianten habe ich auch schon getestet.
Defender ist inzwischen komplett ausgeschaltet, Server steht auf höchst Leistung, Energiesparoptionen auch für die Netzwerkkarte komplett deaktiviert....
Bin inzwischen ratlos.
 

mh1

Sehr aktives Mitglied
4. Oktober 2020
1.594
483
...Aber meiner Meinung nach liegt es am nicht verwendeten Arbeitsspeicher.
Ich weiß ja nicht genau, was du eventuell sonst noch alles untersucht hast, aber in der bisherigen Beschreibung weist ja nichts auf Memory Probleme hin.
Vielmehr weist die bisherige Beschreibung auf Probleme im E/A Subsystem hin.
In der Fehlermeldung wird angegeben, dass die Seite vom OS zwar erfolgreich vom Datenträger gelesen, aber vom SQL Server ein Fehler auf dieser Seite festgestellt wurde (oder ist die von dir genannte Fehlermeldung nicht die ID 824?)

Hier liegen die Ursachen dann meist eher bei fehlerhaften Treibern, veraltete Firmware, oder sogar ganz defekte Datenträger.

Mehr Informationen über das E/A Subsystem findest du in diesem Whitepaper:
https://learn.microsoft.com/de-de/p...ver-2005/administrator/cc917726(v=technet.10)
und
https://learn.microsoft.com/en-us/previous-versions//cc966500(v=technet.10)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: MichaelH

Frank Hoffmeister

Sehr aktives Mitglied
11. Mai 2014
142
28
Deswegen will ich es ja mit einer zusätzlichen M2 SSD für die Temdbs versuchen, es sind nämlich sämtliche Treiber und Firmware aktuell und wie gesagt der Fehler bestand auch schon beim alten Server, und im neuen sind selbstverständlich auch neue SATA SSDs.
Microsoft sagt aber auch das:
Die Sortier- und Hashvorgänge arbeiten mit den SQL Server Speicher-Managern zusammen, um die Größe des Speicherbereichs im Arbeitsspeicher für jeden Sortier- oder Hashvorgang zu bestimmen. Sobald die Sortier- oder Hashdaten den zugeordneten Speicherbereich überschreiten, können Daten in die tempdb-Datenbank geschrieben werden.
Folglich ist nicht so ganz nachvollziehbar weshalb ca. 80 GB RAM einfach nicht vom SQL SERVER Speicher Manager genutzt werden sondern stattdessen extrem die Tempdb.
 

mh1

Sehr aktives Mitglied
4. Oktober 2020
1.594
483
Vielleicht liegt es an "spills". Also Abfragen, bei denen der SQL-Server die Größe der Ergebnismenge falsch abschätzt, deshalb eine falsche Speicherzuweisung macht und in der Folge dann Speicherplatz auf dem Datenträger bzw. die tempdb verwendet.
Wenn sich die problematischen Abfragen noch im Plancache befinden, kannst du die mit sp_BlitzCache @SortOrder = 'spills' finden.

Hast du eigene Abfragen gebastelt?
 

MichaelH

Sehr aktives Mitglied
17. November 2008
14.175
1.773
Bin kein Fachmann, aber man liest immer wieder:

Der Server hat massig RAM, aber die DB weigert sich diesen RAM zu nutzen.
Auch wenn eine DB 10 oder 20 GB hat, der RAM liegt bei 32 oder 64GB, da wäre Platz für alle Daten, zumindest hot-tables, und deren Indexe.
Änderungen würden im RAM passieren und werden zeitverzögert auf die SSD geschrieben.

Warum diese Systeme nicht optimal genutzt werden oder welche Einstellungn gesondert gemacht werden sollten liegt im Dunkel.
"Automatisch" ist es aber offensichtlich nicht der Fall.
 

Frank Hoffmeister

Sehr aktives Mitglied
11. Mai 2014
142
28
Ich habe eigene gebaut, diese sind es aber nicht, Sind in JTL als eigene Übersichten drin, und auf Sonntagabends arbeitet keiner, also werden die auch nicht ausgeführt. Wie gesagt tritt fast immer Sonntag oder Montag früh auf.
Bei der exec DBA.sp_BlitzCache @SortOrder = 'spills' tauchen die üblichen verdächtigen auf:
SQL:
SELECT TOP(10000) * FROM [Ebay].[lvEbayAngebote] AS lvEbayAngebote  WHERE (nStatus IN (@EbayItemStatusLaufend, @EbayItemStatusLaufendError));
SELECT tArtikel.kArtikel,  (    SELECT CASE           WHEN EXISTS    (      SELECT 1      FROM dbo.pf_amazon_angebot         JOIN dbo.pf_user ON pf_user.kUser = pf_amazon_angebot.kUser                   AND pf_user.nAktiv = 1      WHERE pf_amazon_angebot.cSellerSKU = tArtikel.cArtNr      UNION      SELECT 1      FROM dbo.pf_amazon_angebot         JOIN dbo.pf_user ON pf_user.kUser = pf_amazon_angebot.kUser                   AND pf_user.nAktiv = 1         JOIN dbo.pf_amazon_angebot_mapping ON pf_amazon_angebot_mapping.cSellerSKU = pf_amazon_angebot.cSellerSKU                             AND pf_amazon_angebot_mapping.kUser = pf_amazon_angebot.kUser                             AND pf_amazon_angebot_mapping.kArtikel = tArtikel.kArtikel    )           THEN 1           ELSE 0         END  ) AS HasAmazonAngebote,   (      SELECT IIF(          EXISTS          (              SELECT 1              FROM dbo.tArtikelShop artikelShop              JOIN dbo.tShop shop ON shop.kShop = artikelShop.kShop AND shop.nTyp = 6              WHERE artikelShop.kArtikel = tArtikel.kArtikel          ), 1, 0)  ) AS IsAufScxAktiv,  (    SELECT CASE           WHEN EXISTS    (      SELECT 1      FROM dbo.ebay_item      WHERE ebay_item.kArtikel = tArtikel.kArtikel AND ebay_item.status IN (3,7)    )           THEN 1           ELSE 0         END  ) AS HasEbayAngebote,  (    SELECT CASE           WHEN EXISTS    (      SELECT 1      FROM dbo.tWarenLagerEingang      WHERE tWarenLagerEingang.kArtikel = tArtikel.kArtikel          AND tWarenLagerEingang.fAnzahlAktuell > 0    )           THEN 1           ELSE 0         END  ) AS ExistierenWareneingaenge,   (    SELECT CASE           WHEN EXISTS    (      SELECT 1      FROM dbo.tWarenLagerEingang         JOIN dbo.tWarenlagerPlatz ON tWarenlagerPlatz.kWarenLagerPlatz = tWarenlagerEingang.kWarenLagerPlatz         JOIN dbo.tWarenlager ON tWarenlager.kWarenlager = tWarenLagerPlatz.kWarenLager                     AND tWarenlager.nLagerplatzVerwaltung > 0      WHERE tWarenLagerEingang.kArtikel = tArtikel.kArtikel          AND tWarenLagerEingang.fAnzahlAktuell > 0    )           THEN 1           ELSE 0         END  ) AS ExistierenWareneingaengeImWMS,  (      SELECT CASE      WHEN EXISTS      (          SELECT 1          FROM Verkauf.tAuftrag          JOIN Verkauf.tAuftragPosition ON tAuftragPosition.kAuftrag = tAuftrag.kAuftrag          WHERE tAuftragPosition.kArtikel = tArtikel.kArtikel            AND tAuftrag.nKomplettAusgeliefert = 0      )      THEN 1      ELSE 0      END  ) AS IsTeilVonOffenemVerkaufsvorgang,  (      SELECT CASE      WHEN EXISTS      (          SELECT 1          FROM Verkauf.tAuftragPosition          WHERE tAuftragPosition.kArtikel = tArtikel.kArtikel      )      THEN 1      ELSE 0      END  ) AS IsTeilVonVerkaufsvorgang,  (    CASE      WHEN tArtikel.kStueckliste > 0      THEN 1 ELSE 0    END  ) AS IsStueckliste,   (    CASE      WHEN EXISTS    (      SELECT 1      FROM dbo.tArtikel AS ta      WHERE ta.kVaterArtikel = tArtikel.kArtikel    )           THEN 1           ELSE 0         END  ) AS IsVarkombiVater,  (    SELECT CASE           WHEN EXISTS    (      SELECT 1      FROM dbo.teigenschaft      WHERE cTyp IN ('RADIO', 'SELECTBOX', 'IMGSWATCHES', 'TEXTSWATCHES')      AND teigenschaft.kArtikel = tArtikel.kArtikel    )           THEN 1           ELSE 0         END  ) AS HasAuswahlVariation,   CASE WHEN tArtikel.cLagerVariation = 'Y' THEN 1 ELSE 0 END AS HasLagerbestandInVariationen,  (    SELECT CASE WHEN EXISTS (SELECT 1 FROM FulfillmentNetwork.tProductRef WHERE tProductRef.kArtikel = tArtikel.kArtikel AND tProductRef.nType = 1) THEN 1 ELSE 0 END  ) AS IsArtikelBeiFfnHaendler, -- merchant  (    SELECT CASE WHEN EXISTS (SELECT 1 FROM FulfillmentNetwork.tProductRef WHERE tProductRef.kArtikel = tArtikel.kArtikel AND tProductRef.nType = 2) THEN 1 ELSE 0 END  ) AS IsArtikelBeiFfnFulfiller, -- fulfiller  (    SELECT CASE WHEN EXISTS (SELECT 1 FROM FulfillmentNetwork.tProductRef WHERE tProductRef.kArtikel = tArtikel.kArtikel) THEN 1 ELSE 0 END  ) AS IsFulfillmentNetzwerkArtikel,  CASE WHEN tArtikel.nSonderTyp = 1 THEN 1 ELSE 0 END AS IsKartonage,  (      SELECT CASE      WHEN EXISTS      (          SELECT 1          FROM Verkauf.tAuftrag          JOIN Verkauf.tAuftragPosition ON tAuftragPosition.kAuftrag = tAuftrag.kAuftrag          WHERE tAuftragPosition.kArtikel = tArtikel.kArtikel            AND tAuftrag.nType = 1            AND tAuftrag.nKomplettAusgeliefert = 0      )      THEN 1      ELSE 0      END  ) AS IsTeilVonOffenemAuftrag,  (      SELECT CASE      WHEN EXISTS      (          SELECT 1          FROM Verkauf.tAuftrag          JOIN Verkauf.tAuftragPosition ON tAuftragPosition.kAuftrag = tAuftrag.kAuftrag          WHERE tAuftragPosition.kArtikel = tArtikel.kArtikel            AND tAuftrag.nType = 0            AND tAuftrag.nKomplettAusgeliefert = 0      )      THEN 1      ELSE 0      END  ) AS IsTeilVonOffenemAngebot,  (    SELECT CASE           WHEN EXISTS    (      SELECT 1      FROM dbo.tStueckliste AS ta      WHERE ta.kArtikel = tArtikel.kArtikel    )           THEN 1           ELSE 0         END  ) AS IsStuecklistenKomponente,  (    SELECT CASE           WHEN EXISTS    (      SELECT 1      FROM dbo.tKonfigitem AS ta      WHERE ta.kArtikel = tArtikel.kArtikel    )           THEN 1           ELSE 0         END  ) AS IsInKonfigurationEnthalten,   (    SELECT CASE           WHEN EXISTS    (      SELECT 1      FROM dbo.vLagerbestandEx AS ta      WHERE ta.kArtikel = tArtikel.kArtikel          AND ta.fEigenerBestand > 0    )           THEN 1           ELSE 0         END  ) AS HasBestand,   CASE WHEN EXISTS  (    SELECT vLagerbestandProLager.kArtikel      FROM dbo.vLagerbestandProLager      JOIN dbo.tWarenlager ON tWarenlager.kWarenLager = vLagerbestandProLager.kWarenlager                        AND tWarenlager.nFulfillment = 2                        AND tWarenLager.nAktiv = 1      WHERE tArtikel.cLagerAktiv = 'Y'      AND vLagerbestandProLager.fBestand > 0      AND vLagerbestandProLager.kArtikel = tartikel.kArtikel  ) THEN 1 ELSE 0 END AS HasFulfillmentBestand,  CASE WHEN tArtikel.cLagerArtikel = 'Y' THEN 1 ELSE 0 END AS IsSeriennummerArtikel,  CASE WHEN tArtikel.nSeriennummernVerfolgung = 1 THEN 1 ELSE 0 END AS IsSeriennummerVerfolgung,  (    SELECT CASE           WHEN EXISTS    (      SELECT 1      FROM dbo.tArtikel AS ta      WHERE ta.kVaterArtikel = tArtikel.kArtikel          AND ta.cLagerKleinerNull = 'N'    )           THEN 0           ELSE 1         END  ) AS AlleVarkombiKinderHabenUeberverkaeufeErmoeglichen,   (    SELECT CASE           WHEN EXISTS    (      SELECT 1      FROM dbo.tArtikel AS ta      WHERE ta.kVaterArtikel = tArtikel.kArtikel          AND ta.cLagerAktiv = 'Y'    )           THEN 1           ELSE 0         END  ) AS HasVariationskombinationskinderartikelWithBestandsfuehrung,   (    SELECT CASE           WHEN EXISTS    (      SELECT 1      FROM tStueckliste          JOIN tArtikel AS ta ON ta.kArtikel = tStueckliste.kArtikel AND ta.cLagerKleinerNull = 'N'          AND tStueckliste.kStueckliste = tArtikel.kStueckliste    )           THEN 0           ELSE 1         END  ) AS AlleKomponentenHabenUeberverkaeufeErmoeglichen,   (    SELECT CASE           WHEN EXISTS    (      SELECT 1      FROM tPicklistePos      WHERE nStatus < 40          AND tPicklistePos.kArtikel = tArtikel.kArtikel    )           THEN 1           ELSE 0         END  ) AS IsAufAktiverPickliste,   CASE WHEN tArtikel.nCharge = 1 THEN 1 ELSE 0 END AS IsCharge,  CASE WHEN tArtikel.nMhd = 1 THEN 1 ELSE 0 END AS HasMhd,  CASE WHEN tArtikel.cTeilbar = 'Y' THEN 1 ELSE 0 END AS HasTeilbarenBestand,  CASE WHEN tArtikel.cLagerAktiv = 'Y' THEN 1 ELSE 0 END AS IsBestandsFuehrend,  (    SELECT CASE           WHEN EXISTS    (      SELECT 1         FROM pf_amazon_angebot_mapping          JOIN pf_amazon_angebot_fba ON pf_amazon_angebot_mapping.cSellerSKU = dbo.pf_amazon_angebot_fba.cSellerSKU      WHERE pf_amazon_angebot_mapping.kArtikel = tArtikel.kArtikel          AND tArtikel.cLagerAktiv = 'Y'          AND dbo.pf_amazon_angebot_fba.nQuantity > 0.0    )    THEN 1    ELSE 0  END  ) AS HasAmazonBestand,   CASE WHEN tArtikel.cAktiv = 'Y' THEN 1 ELSE 0 END AS IsAktiv,  ( SELECT CASE               WHEN NOT EXISTS      (          SELECT 1           FROM dbo.tEigenschaft te          WHERE  te.kArtikel = tArtikel.kArtikel AND cTyp NOT IN ( 'Freitext' )       )                  THEN 1                  ELSE 0              END  ) AS AlleVariationenSindFreitextVariationen,  ( SELECT CASE               WHEN tlagerbestand.fLagerbestandEigen % 1 > 0               THEN 1               ELSE 0           END    FROM dbo.tlagerbestand    WHERE tlagerbestand.kArtikel = tArtikel.kArtikel) AS HasGeteiltenBestand,  ( SELECT CASE               WHEN tlagerbestand.fAufEinkaufsliste % 1 > 0               THEN 1               ELSE 0           END    FROM dbo.tlagerbestand    WHERE tlagerbestand.kArtikel = tArtikel.kArtikel) AS HasGeteiltenBestandAufEinkaufsliste,  (          SELECT IIF(          EXISTS          (              SELECT 1              FROM dbo.tArtikel komponenten              JOIN dbo.tStueckliste AS stueckliste ON stueckliste.kArtikel = komponenten.kArtikel              WHERE stueckliste.kStueckliste = tArtikel.kStueckliste AND komponenten.cLagerAktiv = 'Y'          ), 1, 0)  ) as MindestensEineKomponenteHatBestandsfuehrungAktiv,  (      SELECT IIF(          EXISTS          (              SELECT 1              FROM dbo.tArtikelShop te               JOIN dbo.tShop ON tShop.kShop = te.kShop              WHERE tShop.nTyp = 4 AND te.kArtikel = tArtikel.kArtikel          ), 1, 0)  ) as IsJtlPosArtikel,  (      SELECT IIF(          EXISTS          (              SELECT 1              FROM Artikel.tArtikelMehrzweckGutschein te               WHERE te.nIsMehrzweckGutschein = 1 AND te.kArtikel = tArtikel.kArtikel          ), 1, 0)  ) as IsMehrzweckGutschein,  (      SELECT IIF(          EXISTS          (              SELECT 1              FROM Artikel.tArtikelMehrzweckGutschein te               WHERE te.nIsMehrzweckGutschein = 1              AND te.nGutscheinTyp = 1              AND te.kArtikel = tArtikel.kArtikel          ), 1, 0)  ) AS IsPhysikalischerGutschein,  (      SELECT IIF(          EXISTS (              SELECT 1              FROM dbo.ebay_item              WHERE ebay_item.kArtikel = tArtikel.kArtikel AND ebay_item.Type = 'V'          )      , 1, 0)  ) AS HatEbayVorlagen,  (      SELECT IIF(          EXISTS (              SELECT 1              FROM dbo.tArtikel AS tArtikelInner              JOIN dbo.tStueckliste ON tArtikelInner.kArtikel = tStueckliste.kArtikel AND tStueckliste.kVaterArtikel = tArtikel.kArtikel              WHERE (tArtikelInner.cTeilbar = 'N' OR tArtikelInner.nIstTeilmengenArtikel = 1)          )      , 1, 0)  ) as MindestensEineKomponenteArbeitetOhneTeilbarenBestand,  (      SELECT IIF(                 EXISTS(                        SELECT 1                        FROM dbo.tLagerArtikel                         JOIN dbo.tWarenlager ON tWarenLager.kWarenLager = tLagerArtikel.kWarenlager                        JOIN dbo.tWarenLagerPlatz ON tWarenLager.kWarenLager = tWarenLagerPlatz.kWarenlager                        WHERE tLagerArtikel.kArtikel = tArtikel.kArtikel                          AND tLagerArtikel.cSeriennr != '#$KEINE$#'                          AND ISNULL(tLagerArtikel.kBestellpos, 0) = 0                          AND tWarenLagerPlatz.kWarenLagerPlatzTyp != 10                        ),                 1,                 0)  ) AS HasBenutzerdefinierteSeriennummern --siehe JTL.Wawi.ArtikelVerwaltung.Core.OldArtikeldetailsStructure.GetLagerartikelByArtikel  FROM dbo.tArtikel  LEFT JOIN  (    SELECT tliefartikel.tArtikel_kArtikel AS kArtikel,          tlieferant.cFirma,          tlieferant.nJtlFulfillment    FROM dbo.tlieferant       JOIN dbo.tliefartikel ON tlieferant.kLieferant = tliefartikel.tLieferant_kLieferant    WHERE tliefartikel.nStandard = 1  ) AS StandardLieferant ON StandardLieferant.kArtikel = tArtikel.kArtikel  WHERE tArtikel.kArtikel IN (@kArtikel_0,@kArtikel_1,@kArtikel_2,@kArtikel_3,@kArtikel_4,@kArtikel_5,@kArtikel_6,@kArtikel_7,@kArtikel_8,@kArtikel_9,@kArtikel_10,@kArtikel_11,@kArtikel_12,@kArtikel_13);
SELECT SUM((((ISNULL(tbestellpos.fVKNetto, 0.0) * ISNULL(tbestellpos.fAnzahl, 0.0) * (1 - (ISNULL(tbestellpos.fRabatt, 0)) / 100) - (ISNULL(tbestellpos.fEKNetto, ISNULL(tbestellpos.fVKNetto * (1 - (ISNULL(tbestellpos.fRabatt, 0)) / 100), 0.0)) * ISNULL(tbestellpos.fAnzahl, 0.0))) / CASE tbestellung.fFaktor WHEN 0 THEN 1.0 ELSE ISNULL(tbestellung.fFaktor, 1.0) END))) - SUM(ISNULL(gs.gutschriftWertNetto,0)) as value,DATEPART (month,trechnung.dErstellt) as position,                                  MAX(trechnung.dErstellt) as datetime                                  FROM Rechnung.tRechnungPosition AS tBestellpos                                  JOIN DEPRECATED.vBestellpos AS bp ON bp.kBestellPos = tBestellpos.kAuftragPosition                  JOIN DEPRECATED.vBestellung AS tBestellung on bp.tBestellung_kBestellung = tbestellung.kBestellung  LEFT JOIN tartikel on bp.tArtikel_kArtikel = tartikel.kArtikel                                    JOIN Rechnung.tRechnung AS trechnung ON tbestellung.tRechnung_kRechnung = trechnung.kRechnung AND trechnung.nStorno = 0                                  LEFT JOIN                      (                        SELECT                         SUM( (((ISNULL(tgutschriftpos.fVKNetto, 0.0) * ISNULL(tgutschriftpos.nAnzahl, 0.0) * (1 - (ISNULL(tgutschriftpos.fRabatt, 0)) / 100)) / ISNULL(tgutschrift.fFaktor, 1.0))) - bp.fEkNetto ) AS gutschriftWertNetto,                                          SUM( (((ISNULL(tgutschriftpos.fVkPreis, 0.0) * ISNULL(tgutschriftpos.nAnzahl, 0.0) * (1 - (ISNULL(tgutschriftpos.fRabatt, 0)) / 100)) / ISNULL(tgutschrift.fFaktor, 1.0))) - (bp.fEkNetto * (1 + (ISNULL(bp.fMwSt, 0.0) / 100)))  )  AS gutschriftWertBrutto,                        tGutschriftPos.kBestellPos,                        tGutschrift.kRechnung                        FROM tGutschriftPos                         JOIN tGutschrift ON tGutschrift.nStorno = 0 AND tGutschrift.nStornoTyp = 0 AND tGutschrift.kGutschrift = tGutschriftPos.tGutschrift_kGutschrift                        JOIN tBestellpos bp ON bp.kBestellPos = tGutschriftPos.kBestellPos                      GROUP BY tGutschriftPos.kBestellPos, tGutschrift.kRechnung                      ) gs ON gs.kBestellPos = tBestellpos.kAuftragPosition AND gs.kRechnung=trechnung.kRechnung                                  WHERE  trechnung.dErstellt >= @startdate                                  AND trechnung.dErstellt < @enddate                                  AND (cType IN ('B', 'V', 'W'))                                  AND (bp.kBestellStueckliste = 0 OR bp.kBestellPos = bp.kBestellStueckliste )                                  AND (tbestellung.nStorno = 0)                                   GROUP BY DATEPART (month,trechnung.dErstellt)                                  OPTION (MAXDOP 1)

Query 1 ist die Ebay laufende Angebote Übersicht aus der Wawi, Query 2 vermute ich Stored Procedure beim Auftrag erstellen aus Amazonbestellungen. , Query 3 ist das Dashboard Widget für die Statisk in der Wawi.

Außerdem jede Menge parallele Pläne, an denen kann ich nichts ändern (Suche nach Aufträgen.....),
Hier haben wir mal was mit ungenutztem RAM:
Queries have large unused memory grants. This can cause concurrency issues, if queries are waiting a long time to get memory to run. usw..
 

mh1

Sehr aktives Mitglied
4. Oktober 2020
1.594
483
Ich habe eigene gebaut, diese sind es aber nicht, Sind in JTL als eigene Übersichten drin, und auf Sonntagabends arbeitet keiner, also werden die auch nicht ausgeführt. Wie gesagt tritt fast immer Sonntag oder Montag früh auf.
Bei der exec DBA.sp_BlitzCache @SortOrder = 'spills' tauchen die üblichen verdächtigen auf:
Die "üblichen Verdächtigen" heißt jetzt genau was?

Die sp_BlitzCache nach den spills zu befragen wird natürlich erst dann richtig sinnvoll, wenn die vermeintlich "Verdächtigen" noch im Plancache stehen ;) In deinem Fall also Sonntag oder Montag früh.

Weitere Idee wäre noch, den Logging Level Sonntags/Montags zu erhöhen und mal kucken, was zu den Zeiten passiert.
 

Frank Hoffmeister

Sehr aktives Mitglied
11. Mai 2014
142
28
Ich habe mir jetzt erst einmal eine Ramdisk für die Tempdb auf einem Test server erstellt und schau mal ob man damit arbeiten kann, viel schneller geht es dann theoretisch nicht.
 

SebastianB

Moderator
Mitarbeiter
6. November 2012
2.084
339
Hi,

zur Erklärung: Die TempDB ist keine "RAM-Datenbank". Die Idee von "Tabellen im Arbeitsspeicher" gibt es in Form von Memory Optimized Tables (und selbst die werden nicht "nur" im RAM gehalten, sondern nur für den Zugriff im RAM optimiert und auch noch auf die Festplatte geschrieben). Sprich: Alles, was man in die TempDB schreibt, landet auf der Festplatte - so ist der SQL-Server konzeptioniert - völlig unabhängig davon, wie viel RAM der SQL-Server zur Verfügung hat. Selbst "Tabellenvariablen" werden in die TempDB und damit auf die Festplatte geschrieben.
Ich vermute mal das hängt damit zusammen, dass am Ende des Tages die TempDB eine "normale" Datenbank ist. Ja, die hat viele Optimierungen reinbekommen (z.B. das Cachen von Tabellenstrukturen) - aber am Ende des Tages ist es auf der unteren Ebene eine Datenbank und der Buffer- Cache-Algorithmus ist meiner Meinung nach der selbe wie in den Nutzerdatenbanken.

Jetzt gibt es verschiedene Dinge die in der TempDB landen: die oben angesprochenen "Spills", temporäre Tabellen die wir in unseren SPs nutzen, Tabellenvariablen (das wird auch gerne von Entwicklern falsch verstanden - die meinen, die würden nur im RAM existieren), wenn man RCSI aktiviert hat der "version store", die "INSERT" und "DELETED"-Tabellen innerhalb der Trigger, usw.

Von den Dingern sind im Grunde einzig die "Spills" vom RAM abhängig - da wird die TempDB wie eine Auslagerungsdatei verwendet. Im Idealfall allokiert der SQL-Server für jede Abfrage "genug" Arbeitsspeicher (und die chancen, dass er "genug" Arbeitsspeicher allokiert, steigen mit dem verfügbaren RAM). In der Realität verschätzt er sich aber immer - und wenn er zu wenig Speicher reserviert, dann müssen ja die Daten irgendwo hin - also werden die in der TempDB zwischengespeichert. Das ist ein grundsätzliches Thema beim SQL-Server, dass er halt Abfragepläne sehr massiv cached und ungünstige Pläne sehr deutliche Auswirkungen haben. In den aktuellen Versionen (2019 und 2022) versucht Microsoft, durch "adaptive Pläne" dem entgegenzutreten. Dort kann ein Plan dann "adaptive Joins" und "adaptive Speicherzuweisungen" haben. Diese Features sind aber noch nicht so geil wie sie sein könnten, sind teilweise erst aber der Enterprise Edition verfügbar und brauchen glaub ich auch einen aktiven Query Store.
Insofern: Man kann versuchen die Spills zu reduzieren, indem man regelmäßig die Statistiken aktualisiert, den Query Store aktiviert und seinen Server ganz fest knuddelt. Aber wirklich wegbekommen wird man diese nicht.

Die JTL-Wawi nutzt viele Trigger und temporäre Tabellen, insofern ist die JTL-Wawi eine Applikation die die TempDB relativ stark fordert.

Aber: Wenn ein Server Probleme mit dem Zugriff auf die Festplatte hat (und das ist ja hier das eigentliche Problem) - dann ist ja nicht die Lösung zu verhindern, dass er die TempDB auf die Festplatte schreibt.

Die Idee die TempDB auf die RAM-Disk zu schieben funktioniert ganz ordentlich in den Express-Editionen. Damit kann man den übrigen RAM zumindest halbwegs sinnvoll nutzen. Auf einem Standard-Server reduziert man damit halt den Speicher, den der Server für den Buffer-Cache zur Verfügung hat. Da hängt der Effekt massiv von der DB-Größe und der Art der DB-Inhalte ab.
 

Frank Hoffmeister

Sehr aktives Mitglied
11. Mai 2014
142
28
Guten Morgen Sebastian,
danke für die Infos, aber mein Problem ist, das es schon der zweite Server ist, der genau diese Probleme macht und immer nur mit dieser Instanz, ich meine echte Server und keine VM oder Neuinstallationen auf bestehendem. Also bin ich auf der Suche warum. Da ich nun 128GB RAM zur Verfügung habe, sonst nichts darauf läuft denke ich einen Versuch ist es Wert. Auf alle Fälle dürfte es wohl einen Geschwindigkeitszuwachs geben. Wie gesagt er verwendet nur 24 GB von dem was er könnte/dürfte.
Übrigens beim alten Server hat er sich viel mehr genommen, da waren es manchmal 60 GB. Auf dem alten Server laufen noch 2 andere SQL Instanzen(keine eazybusiness), diese haben die Problematik nicht, also bin ich nach wie vor der Meinung es liegt an der Instanz.
PS: Ich hab ein Ticket bei euch offen.
Gruß FrankFestplattennutzung Tempdb.jpg
 
Zuletzt bearbeitet:

SebastianB

Moderator
Mitarbeiter
6. November 2012
2.084
339
Aber welches Problem versuchst Du jetzt zu lösen? Wie gesagt: Dass er sich nicht mehr RAM nimmt ist halt normal. Das E/A-Problem hast du auf beiden Instanzen gehabt? Steht denn in den Logs noch mehr dazu?
 

Frank Hoffmeister

Sehr aktives Mitglied
11. Mai 2014
142
28
Ich versuche beides gleichzeitig zu lösen, da ich denke das es zusammenhängt. Und mein Ansatz ist im Moment gerade die Tempdb von der SSD weg zubringen um somit E/A Probleme auszuschließen. In den Logs steht nicht wirklich was dazu, was ich dir anbieten könnte wären Speicher Dumps, da hab ich einige, aber diese zu analysieren ist jetzt nicht so wirklich mein Ding. Herr Gloger hat das Ticket dazu.
 

SebastianB

Moderator
Mitarbeiter
6. November 2012
2.084
339
Na ja, das Thema geht ja nun weit über unseren Support hinaus. Wenn der SQL-Server crasht, sind denn alle Updates eingespielt?
 

Frank Hoffmeister

Sehr aktives Mitglied
11. Mai 2014
142
28
Es sind alle Updates eingespielt, es gibt auch sonst keine Auffälligkeiten(veraltete Treiber, veraltete Firmware usw.) bei dem Server. Ich habe seit einer Stunde das mit der RAMDISK am laufen, jetzt werde ich mal beobachten wie es morgen unter Last ist. Was ich jetzt schon sagen kann Worker mit Ebay, Amazon und Shop läuft sehr viel flüssiger. Die CPU Last ist runter, und die Datenträgerlast auch. Die SSD's habe ich inzwischen auch auf Fehler überprüft (soweit das in meinen Möglichkeiten war) da gab es nichts. Auch eine Leistungsüberwachung der I/O Rate habe ich laufen lassen. Deadlock Ringbuffer ist auch an allerdings ergebnislos.
 
Ähnliche Themen
Titel Forum Antworten Datum
Neu SQL Server kein Mandant auswählbar und Dienst lässt sich nicht starten Installation von JTL-Wawi 2
Neu SQL DB läuft mit Fehler voll und crasht Server JTL-Shop - Fehler und Bugs 1
Neu MS SQL Server auf Windows vs Linux Starten mit JTL: Projektabwicklung & Migration 9
Sql Abfrage VK Preise pro Kundengruppe für Grafana JTL-Wawi 1.8 9
Neu SQL Query zum Bilder löschen Arbeitsabläufe in JTL-Wawi 3
Neu List & Label - Eigene SQL-Abfrage als Grundlage für Tabelle im Berichtscontainer? User helfen Usern - Fragen zu JTL-Wawi 10
Neu Ameise-Vorlage per SQL abrufen und Daten als Ergebnis erhalten JTL Ameise - Eigene Exporte 1
Neu SQL Vartable für Reservierte Artikel gesucht User helfen Usern - Fragen zu JTL-Wawi 2
Neu Innerhalb einer Variable -SQL Abfrage- das Wort "fett" schreiben Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 2
Neu SQL Eigener Export - Eigene Felder im Auftrag User helfen Usern - Fragen zu JTL-Wawi 7
Neu Wie finde ich per SQL heraus welche Aufträge auf Teillieferbar stehen? JTL Ameise - Eigene Exporte 1
Neu Microsoft SQL unter MS365 Installation von JTL-Wawi 2
Neu SQL Abfrage, 3. Mahnstufe User helfen Usern - Fragen zu JTL-Wawi 1
Neu Variable oder SQL zum Feld "Gewinn netto" (im Auftrag) Eigene Übersichten in der JTL-Wawi 9
Neu SQL Code zur Ausgabe des Verkaufspreis je Kundengruppe User helfen Usern 1
Beantwortet Hilfe bei SQL Abfrage erbeten User helfen Usern - Fragen zu JTL-Wawi 3
Neu SQL Abfrage - Sendungsnummern als Liste nach Datum Schnittstellen Import / Export 2
Neu DB: kPlattform eines Auftrages ändern (SQL) - Zwecks Lagerplatzreservierung User helfen Usern - Fragen zu JTL-Wawi 0
Neu SQL prozeduren mit #temp Tabellen Eigene Übersichten in der JTL-Wawi 28
Neu Ameise Export in SQL Abfrage umwandeln User helfen Usern - Fragen zu JTL-Wawi 11
Neu Ware direkt in ein Standardlager einbuchen per SQL StoreProcedure dbo.spWarenlagerEingangSchreiben Schnittstellen Import / Export 9
Neu Probeme WaWi mit POS verbinden - failed to connect - server IP 127.0.0.1 Einrichtung / Updates von JTL-POS 0
Neu Sinnvollste Lösung - eigenen "Server" oder doch Cloud? Installation von JTL-Wawi 7
Neu Server-Logfile-Einträge /io Betrieb / Pflege von JTL-Shop 2
JTL-Search - Hardwarestörung auf einem der Search-Server (s7) Störungsmeldungen 0
Neu Server gelöscht User helfen Usern - Fragen zu JTL-Wawi 2
Neu Anfägerfragen und Installtion auf ngix server Installation / Updates von JTL-Shop 13
Neu Fehlermeldung: Fehler bei der Kommunikation mit dem eA-Server eBay-Anbindung - Fehler und Bugs 3
JTL-Datenbankverwaltung keine Anmeldung am Server - Neuinstallation - Win 10 / Win 11 JTL-Wawi 1.9 4
Gelöst Anbindung POS an Server wird verweigert Verbindung nicht möglich. Einrichtung / Updates von JTL-POS 4
Neu JTL Server bleibt bei "Wird gestartet" hängen Einrichtung / Updates von JTL-POS 2
Neu Kern Waage die im Netzwerk hängt (via Moxa NPort 5100) auf RDP Server mit WMS nutzen User helfen Usern - Fragen zu JTL-Wawi 0
Neu JTL-POS - Worker Abgleich - [Server] Customer-Call found customer: 0 + Kategorienbilder JTL-POS - Fehler und Bugs 4
JTL Shop 5 Hosting auf einem IONOS Server - Performance Allgemeine Fragen zu JTL-Shop 13
Neu Nutzt schon jemand den Lister 2.0 erfolgreich? Amazon-Lister - Ideen, Lob und Kritik 4
Neu Ware ins Amazon Lager senden, nutzt ihr dafür JTL? Amazon-Anbindung - Ideen, Lob und Kritik 5

Ähnliche Themen