Erstellt vor 18 Monaten

Geschlossen vor 18 Monaten

#2359 closed Fehler (fixed)

sub get_warehouse takes ages

Erstellt von: od-peter Verantwortlicher: m.bunkus@…
Priorität: normal Meilenstein:
Komponente: kivitendo ERP Version: 3.0.0 unstable
Schweregrad: normal Stichworte:
Beobachter:

Beschreibung

Mit steigender Anzahl an Lagerbewegungen und Waren wird es immer schwieriger Lagerplätze zu bearbeiten da die Abfrage immer länger dauert.
Ursache ist vermutlich die Änderung der SQL-Abfrage in get_warehouse im Commit 82c4717 (Ticket #2284).

Statt aktuell:

(SELECT i.warehouse_id, p.warehouse_id FROM inventory i, parts p WHERE i.bin_id = b.id OR p.bin_id = b.id LIMIT 1) 

Sollte man an dieser Stelle evtl. besser mit UNION arbeiten:

(
(SELECT i.warehouse_id FROM inventory i WHERE i.bin_id = b.id LIMIT 1) 
UNION
(SELECT p.warehouse_id FROM parts p WHERE p.bin_id = b.id LIMIT 1) 
)

Damit läuft die Abfrage in meinem Fall keine 3 Minuten (!) mehr sondern unter einer Sekunde.

Gruß Peter

PS: Patch folgt.

Änderungshistorie (2)

comment:1 Geändert vor 18 Monaten durch m.bunkus@…

Klingt sinnvoll & sieht logisch betrachtet richtig aus, ja.

Noch sinnvoller wäre eine Aufsplitting des EXISTS selber, grob gesehen so:

SELECT b.*,
  (   EXISTS(SELECT i.bin_id FROM inventory i WHERE i.bin_id = b.id LIMIT 1)
   OR EXISTS(SELECT p.bin_id FROM parts     p WHERE p.bin_id = b.id LIMIT 1))
  AS in_use
FROM bin b
WHERE b.warehouse_id = ?

Grund: so kann die Datenbank besser Shortcutten und nach dem Scan der ersten Tabelle eventuell schon abbrechen.

Ich patch das kurz (hab das Query ja schon umgeschrieben), du brauchst keinen Patch mehr zu schicken.

comment:2 Geändert vor 18 Monaten durch m.bunkus@…

  • Lösung auf fixed gesetzt
  • Status von new nach closed geändert
  • Verantwortlicher auf m.bunkus@… gesetzt

In af6756b86c0d800e5e95638c455525eddf44d22c/erp:

AM.pm::get_warehouse: keinen teuren Cross Join

Ein Cross Join wird nicht benötigt, weil nur die Existenz einer Zeile
in mind. einer der beiden relevanten Tabellen interessant ist. Das
auch entsprechend coden.

Fixt #2359.

Hinweis: Hilfe zur Verwendung von Tickets finden Sie in TracTickets.