Neu Überlastung des Servers durch Ihre Datenbank über Abfragen

Baltazar80

Gut bekanntes Mitglied
18. Januar 2014
260
17
Hallo,

heute haben wir eine E-Mail von All-Inkl. erhalten, dass unsere Datenbank durch zu lange Abfragenlaufzeiten (teil parallel) die Server überlastet werden, und dass die Leidtung der anderen Kunden beinflusst? Was können wir da machen, und wodurch wird das verursacht. Wir haben erst kürzlich von 4.05 auf JTL Shop 5.14 geupdatet.

Hier das Schreiben von All-Inkl:

wir mussten eine anhaltende Überlastung des Server, ausgelöst durch Ihre Datenbank ..... feststellen. Dabei laufen einige Abfragen teils über 60000 Sekunden und lasten dabei die CPU aus. Durch die lange Laufzeit werden die Abfragen teils mehrfach parallel ausgeführt.

Die Abfragen entsprechen alle dem selben Schema. Bitte optimieren Sie diese, reduzieren Sie die abzufragenden Daten oder verzichten Sie auf diese. Aktuell schränken Sie durch die abgeforderte Leistung die Accounts der anderen Kunden auf dem Server ein.

Es handelt sich um Abfragen nach folgendem Schema:
Bitte bestätigen Sie den Empfang dieser Mail und teilen Sie uns die getroffenen Maßnahmen mit.


Code:
SELECT MAX(ssMerkmal.fMax) AS fMax, MIN(ssMerkmal.fMin) AS fMin FROM (SELECT ROUND( LEAST( (tpreisdetail.fVKNetto * 1) * ((100 - GREATEST(IFNULL(tartikelkategorierabatt.fRabatt, 0), 0, 0, 0)) / 100), IFNULL(tsonderpreise.fNettoPreis, (tpreisdetail.fVKNetto * 1))) * ((100 + 19.00) / 100), 2) AS fMax, ROUND(LEAST((tpreisdetail.fVKNetto * 1) * ((100 - GREATEST(IFNULL(tartikelkategorierabatt.fRabatt, 0), 0, 0, 0)) / 100), IFNULL(tsonderpreise.fNettoPreis, (tpreisdetail.fVKNetto * 1))) * ((100 + 5.00) / 100), 2) AS fMin FROM tartikel #JOIN from JTL\Filter\States\BaseCategory::getSQLJoin JOIN tkategorieartikel ON tartikel.kArtikel = tkategorieartikel.kArtikel #join from JTL\Filter\Items\Characteristic::getSQLJoin JOIN tartikelmerkmal ON tartikel.kArtikel = tartikelmerkmal.kArtikel #join1 from JTL\Filter\Items\PriceRange::getSQLJoin JOIN (tpreis #subjoin for tpreis table JOIN tpreisdetail ON tpreisdetail.kPreis = tpreis.kPreis AND tpreisdetail.nAnzahlAb = 0) ON tartikel.kArtikel = tpreis.kA
 rtikel AND tpreis.kKundengruppe = 1 #join2 from JTL\Filter\Items\PriceRange::getSQLJoin LEFT JOIN tartikelkategorierabatt ON tartikelkategorierabatt.kKundengruppe = 1 AND tartikelkategorierabatt.kArtikel = tartikel.kArtikel #join3 from JTL\Filter\Items\PriceRange::getSQLJoin LEFT JOIN tartikelsonderpreis ON tartikelsonderpreis.kArtikel = tartikel.kArtikel AND tartikelsonderpreis.cAktiv = 'Y' AND tartikelsonderpreis.dStart <= NOW() AND (tartikelsonderpreis.dEnde IS NULL OR tartikelsonderpreis.dEnde >= CURDATE()) #join4 from JTL\Filter\Items\PriceRange::getSQLJoin LEFT JOIN tsonderpreise ON tartikelsonderpreis.kArtikelSonderpreis = tsonderpreise.kArtikelSonderpreis AND tsonderpreise.kKundengruppe = 1 #product visiblity join from getBaseQuery LEFT JOIN tartikelsichtbarkeit ON tartikel.kArtikel = tartikelsichtbarkeit.kArtikel AND tartikelsichtbarkeit.kKundengruppe = 1 WHERE tkategorieartikel.kKategorie IN ( SELECT tchild.kKategorie FROM tkategorie AS tparent JOIN tkategorie AS tchild ON
  tchild.lft BETWEEN tparent.lft AND tparent.rght WHERE tparent.kKategorie = 6) AND tartikelmerkmal.kArtikel IN (SELECT kArtikel FROM tartikelmerkmal WHERE kMerkmalWert IN (32)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition GHS06: Totenkopf mit gekreuzten Knochen AND tartikelmerkmal.kArtikel IN (SELECT kArtikel FROM tartikelmerkmal WHERE kMerkmalWert IN (65)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition H301 AND tartikelmerkmal.kArtikel IN (SELECT kArtikel FROM tartikelmerkmal WHERE kMerkmalWert IN (184)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition P312 AND tartikelmerkmal.kArtikel IN (SELECT kArtikel FROM tartikelmerkmal WHERE kMerkmalWert IN (191)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition P330 AND tartikelmerkmal.kArtikel IN (SELECT kArtikel FROM tartikelmerkmal WHERE kMerkmalWert IN (224)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition P301 + P310 AND tartikelmerkmal.kArtikel IN (
 SELECT kArtikel FROM tartikelmerkmal WHERE kMerkmalWert IN (229)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition P302 + P352 AND tartikelmerkmal.kArtikel IN (SELECT kArtikel FROM tartikelmerkmal WHERE kMerkmalWert IN (252)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition P405 AND tartikelmerkmal.kArtikel IN (SELECT kArtikel FROM tartikelmerkmal WHERE kMerkmalWert IN (267)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition P501 AND tartikelsichtbarkeit.kArtikel IS NULL AND tartikel.kVaterArtikel = 0 #default group by GROUP BY tartikel.kArtikel #limit sql ORDER BY tartikel.dErstellt DESC, tartikel.cName ) AS ssMerkmal
 

Baltazar80

Gut bekanntes Mitglied
18. Januar 2014
260
17
Seitens All-Inkl. brauchen wir schnellstens eine Lösung dafür. Leider kenne ich mich mit diesem Thema gar nicht aus, also welche Möglichkeiten hätten wir denn diese Abfragen zu stoppen oder die Zeiten zu reduzieren?
 

css-umsetzung

Offizieller Servicepartner
SPBanner
6. Juli 2011
6.696
1.611
Berlin
Dazu müsste man zuerst wissen wer diese Abfrage auslöst.
Auf den ersten Blick sieht es nach einer Abfrage über die Merkmalfilter aus.

Habt Ihr soviele Merkmale?
JTL draufschauen lassen wäre die erste Wahl, wenn die nicht weiterkommen dann muss der Shop auseinander genommen werden.
 

Baltazar80

Gut bekanntes Mitglied
18. Januar 2014
260
17
Ehrlich gesagt, nutzen wir fast gar keine Merkmale. Wir hatten aber beim JTL Shop 4.05 testhalber mal das CLP Plugin instlliert, oder bzw. die Merkmale in JTL Wawi eingelesen. Das Plugin stammt sogar von euch oder?
Aber im neuen JTL Shop 5 haben wir das Plugin noch gar nicht installiert, wollten wir aber demnächst noch machen. Könnte es sein, dass es davon kommt, dass die Merkmale in JTL Wawi immer noch drin sind, aber kein passendes Plugin im Shop dazu vorhanden ist?
 

Baltazar80

Gut bekanntes Mitglied
18. Januar 2014
260
17
ich kenne kein CLP Plugin. Nein dann muss das anhand des Querys geprüft werden. So kann das ja nicht bleiben. Von außen ist hier keine Analyse möglich.
Ich meine folgendes Plugin:

https://css-umsetzung.de/shop/CSS-Gefahrenklasse

Also die Gefahrenklasse Plugin, könnte es was damit zu tun haben, den hatten wir testhalber in Shop 4.05 installiert, aber im neuen Shop 5 noch nicht, kann es da Datenrückstände oder sowas geben?
 

css-umsetzung

Offizieller Servicepartner
SPBanner
6. Juli 2011
6.696
1.611
Berlin
Nein, meine Plugins legen für sich eigene Tabellen an, die werden nur durch mein Plugin ausgelesen,
selbst wenn die da noch in der Datenbank rumliegen würde weil das Plugin nicht komplett deinstalliert wurde, dann würde diese nichts bewirken und einfach nur sinnlos drin rumliegen.
 

Baltazar80

Gut bekanntes Mitglied
18. Januar 2014
260
17
Wir haben jetzt nochmal einen Nachricht erhalten, dass All-Inkl jetzt unsere Daten auf einen anderen Server umziehen wird, damit der Server nicht für die anderen Kunden ausgelastet wird.

Also ich verstehe das nicht, bitte einer JTL soll sich das mal anschauen, ich habe ja einen Beispielcode im ersten Post gepostet, für einen Erfahrenen muss es doch da ersichtlich sein, was das für Abfragen sind, und warum diese ausgeführt werden, und wie man das unterbinden kann.
 

Baltazar80

Gut bekanntes Mitglied
18. Januar 2014
260
17
Nein, meine Plugins legen für sich eigene Tabellen an, die werden nur durch mein Plugin ausgelesen,
selbst wenn die da noch in der Datenbank rumliegen würde weil das Plugin nicht komplett deinstalliert wurde, dann würde diese nichts bewirken und einfach nur sinnlos drin rumliegen.
Ich habe mal den Code angeschaut, und da kommt folgendes vor:


Code:
#condition from JTL\Filter\Items\Characteristic::getSQLCondition GHS06: Totenkopf mit gekreuzten Knochen

Soweit ich weiß, muss ja das GHS06: Totenkopf irgendwas mit dem Gefahrenklasse Plugin zu tun haben oder?
 

css-umsetzung

Offizieller Servicepartner
SPBanner
6. Juli 2011
6.696
1.611
Berlin
Soweit ich weiß, muss ja das GHS06: Totenkopf irgendwas mit dem Gefahrenklasse Plugin zu tun haben oder?
Nein, das ist ein Merkmal und wird vom Shop verwaltet.
Von meinem Plugin werden die Merkmale nicht ausgelesen, die werden vom Shop ausgelesen und dann im Template zur Verfügung gestellt.

Mein Plugin macht nichts anderes als aus den Merkmalen, die der Shop im Template zur Verfügung stellt,
die für die GS anzeige zuständigen Merkmale aus der Variable zu extrahieren. Hierfür ist keine Datenbankabfrage erforderlich.

Und ganz ehrlich, niemand der SP hier setzt sich hin und formatiert ungefragt deinen SQL Query mit dem er nichts anfangen kann weil die zugehörige Datenbank fehlt.
Tatsache ist, das es scheint als ob da jemand im Artikellisting nach Merkmalen filtert und die Datenbank das dann wohl nicht packt.

Aber ohne die zugehörige Datenbank oder auch dem Shop und das zugehörige Log wird hier niemand etwas dazu sagen können.
Das ist im Grunde ein Fall für den kostenlosen Support von JTL, wenn das ein SP prüft kann das recht teuer werden.

Wenn die Merkmale gar nicht genutzt werden, dann würde ich sie löschen.

-> das hier ist nur der Hinweis nach was für einem Merkmal gefiltert wird, auch das hat mit meinem Plugin nichts zu tun, das könnte auch jedes andere Merkmal sein:
#condition from JTL\Filter\Items\Characteristic::getSQLCondition GHS06: Totenkopf mit gekreuzten Knochen

so sieht der Query einigermaßen formatiert aus, da sieht man das diese Filterung unter anderem etwas mit der Preisfilterung zu tun hat, es könnte also auch an der Menge der Artikel liegen, das ist aber alles nur Rätselraten und macht keinen Sinn ohne im System zu sein.

SQL:
SELECT
    MAX(ssMerkmal.fMax) AS fMax,
    MIN(ssMerkmal.fMin) AS fMin
FROM
    (
    SELECT
        ROUND(
            LEAST(
                (tpreisdetail.fVKNetto * 1) *(
                    (
                        100 - GREATEST(
                            IFNULL(
                                tartikelkategorierabatt.fRabatt,
                                0
                            ),
                            0,
                            0,
                            0
                        )
                    ) / 100
                ),
                IFNULL(
                    tsonderpreise.fNettoPreis,
                    (tpreisdetail.fVKNetto * 1)
                )
            ) *((100 + 19.00) / 100),
            2
        ) AS fMax,
        ROUND(
            LEAST(
                (tpreisdetail.fVKNetto * 1) *(
                    (
                        100 - GREATEST(
                            IFNULL(
                                tartikelkategorierabatt.fRabatt,
                                0
                            ),
                            0,
                            0,
                            0
                        )
                    ) / 100
                ),
                IFNULL(
                    tsonderpreise.fNettoPreis,
                    (tpreisdetail.fVKNetto * 1)
                )
            ) *((100 + 5.00) / 100),
            2
        ) AS fMin
    FROM
        tartikel #JOIN from JTL\Filter\States\BaseCategory::getSQLJoin JOIN tkategorieartikel ON tartikel.kArtikel = tkategorieartikel.kArtikel #join from JTL\Filter\Items\Characteristic::getSQLJoin JOIN tartikelmerkmal ON tartikel.kArtikel = tartikelmerkmal.kArtikel #join1 from JTL\Filter\Items\PriceRange::getSQLJoin JOIN (tpreis #subjoin for tpreis table JOIN tpreisdetail ON tpreisdetail.kPreis = tpreis.kPreis AND tpreisdetail.nAnzahlAb = 0) ON tartikel.kArtikel = tpreis.kA
        rtikel AND tpreis.kKundengruppe = 1 #join2 from JTL\Filter\Items\PriceRange::getSQLJoin LEFT JOIN tartikelkategorierabatt ON tartikelkategorierabatt.kKundengruppe = 1 AND tartikelkategorierabatt.kArtikel = tartikel.kArtikel #join3 from JTL\Filter\Items\PriceRange::getSQLJoin LEFT JOIN tartikelsonderpreis ON tartikelsonderpreis.kArtikel = tartikel.kArtikel AND tartikelsonderpreis.cAktiv = 'Y' AND tartikelsonderpreis.dStart <= NOW() AND (tartikelsonderpreis.dEnde IS NULL OR tartikelsonderpreis.dEnde >= CURDATE()) #join4 from JTL\Filter\Items\PriceRange::getSQLJoin LEFT JOIN tsonderpreise ON tartikelsonderpreis.kArtikelSonderpreis = tsonderpreise.kArtikelSonderpreis AND tsonderpreise.kKundengruppe = 1 #product visiblity join from getBaseQuery LEFT JOIN tartikelsichtbarkeit ON tartikel.kArtikel = tartikelsichtbarkeit.kArtikel AND tartikelsichtbarkeit.kKundengruppe = 1 WHERE tkategorieartikel.kKategorie IN ( SELECT tchild.kKategorie FROM tkategorie AS tparent JOIN tkategorie AS tchild ON
        tchild.lft BETWEEN tparent.lft AND tparent.rght
    WHERE
        tparent.kKategorie = 6
) AND tartikelmerkmal.kArtikel IN(
    SELECT
        kArtikel
    FROM
        tartikelmerkmal
    WHERE
        kMerkmalWert IN(32)
) #condition from JTL\Filter\Items\Characteristic::getSQLCondition GHS06: Totenkopf mit gekreuzten Knochen AND tartikelmerkmal.kArtikel IN (SELECT kArtikel FROM tartikelmerkmal WHERE kMerkmalWert IN (65)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition H301 AND tartikelmerkmal.kArtikel IN (SELECT kArtikel FROM tartikelmerkmal WHERE kMerkmalWert IN (184)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition P312 AND tartikelmerkmal.kArtikel IN (SELECT kArtikel FROM tartikelmerkmal WHERE kMerkmalWert IN (191)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition P330 AND tartikelmerkmal.kArtikel IN (SELECT kArtikel FROM tartikelmerkmal WHERE kMerkmalWert IN (224)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition P301 + P310 AND tartikelmerkmal.kArtikel IN (
SELECT
    kArtikel
FROM
    tartikelmerkmal
WHERE
    kMerkmalWert IN(229)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition P302 + P352 AND tartikelmerkmal.kArtikel IN (SELECT kArtikel FROM tartikelmerkmal WHERE kMerkmalWert IN (252)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition P405 AND tartikelmerkmal.kArtikel IN (SELECT kArtikel FROM tartikelmerkmal WHERE kMerkmalWert IN (267)) #condition from JTL\Filter\Items\Characteristic::getSQLCondition P501 AND tartikelsichtbarkeit.kArtikel IS NULL AND tartikel.kVaterArtikel = 0 #default group by GROUP BY tartikel.kArtikel #limit sql ORDER BY tartikel.dErstellt DESC, tartikel.cName ) AS ssMerkmal
 

NewBuy

Sehr aktives Mitglied
29. August 2016
2.001
307
Wir hatten dieses Problem auch mal in Verbindung mit Unicorn2 die hatten aus irgendeinen Grund eine Abfrage zum Shop
 

Clearcanvas

Aktives Mitglied
10. Juni 2015
9
0
Hallo Baltazar80,
wir hatten das Problem ebenfalls bei einem Kunden. Am Ende stellte sich heraus, dass über Suchmaschinen die mehrfach gefilterten Kategorien gecrawlt wurden. Diese sehr lange laufenden Abfragen fallen dann irgendwann in einen Sleep Mode und laufen quasi unendlich.

Wir haben uns mit mehren Mitteln geholfen.

1. Wir haben in der robots.txt verboten, dass gefilterte Listen von Suchmaschinen gecrawlt werden:
Code:
User-agent: *
Disallow: *__*

2. Lassen wir regelmäßig schlafende MySQL Queries nach einer bestimmten Zeit killen. Du kannst ja mal mit
Code:
SHOW PROCESSLIST;
gucken ob entsprechende Queries vorliegen.
 
Ähnliche Themen
Titel Forum Antworten Datum
Stücklistenartikel - keine Übernahme des ek JTL-Wawi 1.8 1
Neu Abfrage des Lieferantenbestands Eigene Übersichten in der JTL-Wawi 4
Aufträge zusammenfassen - Bestellnummern des Kunden werden nicht übernommen JTL-Wawi 1.8 1
Ausgabe des Warenbestandes mit Fulfillment Lager JTL-Wawi 1.8 0
Verknüpfung des variantenbildenden Merkmals Otto.de - Anbindung (SCX) 0
Neu Umlagerung waehrend des Prozesses eingefroren User helfen Usern - Fragen zu JTL-Wawi 0
Neu Änderung des Auftrags nach Zahlungseingang Paypal Arbeitsabläufe in JTL-Wawi 7
Neu Pulsierender Punkt bei Aufruf des Backends Gelöste Themen in diesem Bereich 12
Neu Update des JTL shops aus der Wawi funktioniert nicht Allgemeine Fragen zu JTL-Shop 1
Neu Falscher Bestand nach Abbruch des Lieferschein-Lösch-Vorgangs JTL-Wawi - Fehler und Bugs 0
Neu Eigene Felder des Auftrages in der Druckvorlage Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 2
Beantwortet Farbe des Auftrages bei Retouren angepasst JTL-Workflows - Ideen, Lob und Kritik 1
Neu Download-Arikel werden im Backend des Kunden nicht angezeigt JTL-Shop - Fehler und Bugs 1
Neu Woran kann es liegen, dass ein neu erstellter Connector-Verkaufskanal nicht in der Statusliste des Workers vorkommt? Shopify-Connector 2
Neu Keine Artikel Details nach Serverumzug (Wechsel des Hosters) Gelöste Themen in diesem Bereich 7
Neu Einstellung: "Bilder des Vaterartikels un der folgenden Variationswerte übernehmen" und der Shopware Server "explodiert" Shopware-Connector 11
Neu Nach Installation eines neuen SQL Servers klappt die Verbindung vom Benutzer-PC zum Server-PC nicht mehr. Installation von JTL-Wawi 5

Ähnliche Themen