Mysql: Abfrage dauert ewig.

null_plan

Mitglied
Hallo Forum,

ich habe ein riesen Problem mit folgendem Code:

SQL:
SELECT 
  artikel_preis.ARTIKEL_ID 
FROM 
  artikel_preis
LEFT JOIN 
   t_update 
ON  
   t_update.ARTIKELNR = artikel_preis.BESTNUM
WHERE 
    artikel_preis.BESTNUM IS NOT NULL
AND 
    t_update.LIEFER_ID is null;

Wenn ich diese Abfrage (es befinden sich ca. 20.000 Datensätze in den Tabellen) passiert Stunden lang nichts, wie kann man das optimieren.

Schon mal vielen Dank für Eure Hilfe.
 
Zuletzt bearbeitet von einem Moderator:
Hallo.

Wenn ich das richtig sehe, willst du all jene artikel_id's ausgeben die in der Tabelle "artikel_preis" stehen und zusätzlich jene, wo die BESTNUM der ARTIKELNR entspricht. Da ist klar, dass es bei 20000 Datensätzen, jede Menge Zeitaufwand benötigt.

Willst du wirklich diesen Join anwenden oder hast du den left join mit dem inner join verwechselt?

MfG
Nadriel
 
Hallo Nadriel,

die Situation ist die, in der t_update sind die aktuell lieferbaren Artikel (ARTIKELNR) des Lieferanten (LIEFER_ID) in der artikel_preis sind die vorhandenen Artikel aller Lieferanten. Ich versuche jetzt alle Artikel aus der artikel_preis die NICHT in der Tabelle t_update vorhanden sind heraus zu filtern.
Ich hoffe ich habe mich verständlich ausgedrückt.
 
Hallo.

Folgendes:
Du kannst das so mit einem Join nicht machen. Mein Vorschlag wäre eine Subquery:

Code:
SELECT 
   ARTIKEL_ID 
FROM 
   artikel_preis
WHERE 
   BESTNUM NOT IN 
   (
      SELECT 
         ARTIKELNR
      FROM
         t_update
      WHERE
         LIEFER_ID IS NULL
   )
AND
   BESTNUM IS NOT NULL;

Hier geschieht folgendes:
Zuerst wird die artikel aus der tabelle artikel_preis herausgeholt, danach wird bestnum mit der artikelnr aus t_update verglichen und bei keiner Übereinstimmung wird der Wert dann hinausgeschrieben.

MfG
Nadriel
 
Zuletzt bearbeitet:
@Sven

hab ich auch schon versucht aber das Ergebnis ist das gleiche :(

@Nadriel

dein Query läuft aber das schon seit einigen Minuten.

@all

Würde es Sinn machen das ganze über temporäre Tabellen zu lösen?
 
Hallo.

Also trotzdem würde ich meine Query empfehlen, da die meiner Meinung nach in der Logik stimmt im Gegensatz zu deiner.

Zu den temporären Tabellen:
Ich denke diese Tabellen anzulegen dürfte zeitlich nicht wirklich was bringen, aber das musst du bei der großen Anzahl selbst ausprobieren.

Gruß
Nadriel
 
Andere Idee:

SQL:
SELECT 
  artikel_preis.ARTIKEL_ID 
FROM 
  artikel_preis
WHERE 
  !FIND_IN_SET(artikel_preis.BESTNUM,(SELECT GROUP_CONCAT(t_update.LIEFER_ID) from t_update))


Also trotzdem würde ich meine Query empfehlen, da die meiner Meinung nach in der Logik stimmt im Gegensatz zu deiner.

Die Logik stimmt auch bei seinem Query, wenn er das ON umdreht, wie von mir vorgeschlagen.
Wenn die rechte Tabelle im ON keinen passenden Datensatz zur linken Tabelle hat, wird ein Dummie-Datensatz mit NULL-Werten erzeugt.
Die WHERE-Klausel für t_update.LIEFER_ID wäre somit erfüllt.

Diese Methode wird sogar im Manual beschrieben.:)
 
Das mit den temporären Tabellen war auch kein guter Ansatz :(

@Sven

Dein Query rennt aber es findet auch Artikel die definitiv in der t_update vorhanden sind.

Habt ihr noch irgend eine Idee?
 
Dein Query rennt aber es findet auch Artikel die definitiv in der t_update vorhanden sind.

Oh, sorry, natürlich...hab die falsche Spalte beim GROUP_CONCAT genommen :-(

So sollte es besser gehen:
SQL:
SELECT
  artikel_preis.ARTIKEL_ID
FROM
  artikel_preis
WHERE
  !FIND_IN_SET(artikel_preis.BESTNUM,(SELECT GROUP_CONCAT(t_update.ARTIKELNR) FROM t_update))
 
Zurück