Erstellt vor 18 Monaten

Geschlossen vor 14 Monaten

#2367 closed Fehler (fixed)

Lieferplan: längere Antwortzeiten mit steigendem Datenbestand

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

Beschreibung

Bei einer etwas größeren Installation haben wir leider das Problem, das mit steigender Anzahl an Aufträgen/Lieferscheinen? die Performance des Lieferplans zunehmend schlechter wird.

Aktuell liegt die Antwortzeit bei knapp 2 Minuten (!), so dass der Lieferplan praktisch unbenutzbar ist.
Der Report liefert dabei 68 Seiten (mit je 40 Positionen pro Seite) Auch jeder weitere Änderung im fertigen Report (Änderung der Sortierung, anwenden von Filtern) oder der CSV/PDF-Export dauert min. genau so lange...

Änderungshistorie (9)

comment:1 Geändert vor 18 Monaten durch s.schoeling@…

Uff da brauch ich viel mehr Informationen. Oder Ihr nehmt das Query selbst auseinander und schaut warum das so langsam ist.

comment:2 Geändert vor 14 Monaten durch od-peter

Merge Join (cost=0.00..222230.20 rows=368 width=4)

Merge Cond: (rl.from_id = oi.trans_id)
Join Filter: (NOT (SubPlan? 1))
-> Merge Join (cost=0.00..1691.00 rows=158 width=12)

Merge Cond: (oe.id = rl.from_id)
-> Index Scan using oe_pkey on oe (cost=0.00..1124.00 rows=389 width=4)

Filter: ((customer_id IS NOT NULL) AND ((NOT quotation) OR (quotation IS NULL)) AND (NOT closed))

-> Index Scan using idx_record_links_from_id on record_links rl (cost=0.00..599.44 rows=4508 width=8)

Filter: (((from_table)::text = 'oe'::text) AND ((to_table)::text = 'delivery_orders'::text))

-> Index Scan using orderitems_trans_id_key on orderitems oi (cost=0.00..2729.84 rows=27631 width=12)
SubPlan? 1

-> Seq Scan on delivery_order_items doi (cost=0.00..974.81 rows=3 width=4)

Filter: (delivery_order_id = rl.to_id)

(13 rows)

comment:3 Geändert vor 14 Monaten durch s.schoeling@…

Im Livesystem debuggt, Schritt 5 im Query hängt lange (siehe query planer oben)

comment:4 Geändert vor 14 Monaten durch s.schoeling@…

Ok, hab nen besseren Algorithmus, und dabei auch noch bugs im aktuellen algorithmus entdeckt, die aufteten, wenn jemand 2 Lieferscheine für einen Auftrag anlegt, und nur in einem von beiden bestimte Waren besetzt.

comment:5 Geändert vor 14 Monaten durch s.schoeling@…

nicht finales query:

SELECT incmap.id from (

SELECT oi.id, oi.trans_id, agg.parts_id, rl.to_id
FROM orderitems oi LEFT JOIN (

SELECT rl.from_id as oid, doi.parts_id, count(doi.id) FROM (

SELECT from_id, to_id
FROM record_links rl
LEFT JOIN oe ON oe.id = from_id
WHERE

rl.from_table = 'oe' AND
rl.to_table = 'delivery_orders' AND

oe.customer_id IS NOT NULL AND
(oe.quotation = 'f' OR oe.quotation IS NULL) AND NOT oe.closed

) rl
LEFT JOIN delivery_order_items doi ON (rl.to_id = doi.delivery_order_id)
GROUP BY rl.from_id, rl.to_id, doi.parts_id

) agg ON agg.oid = oi.trans_id AND
agg.parts_id = oi.parts_id
LEFT JOIN record_links rl ON oi.trans_id = rl.from_id AND rl.from_table = 'oe'

) incmap
LEFT JOIN oe ON oe.id = incmap.trans_id
WHERE parts_id IS NULL AND incmap.to_id > 0 AND
oe.customer_id IS NOT NULL AND

(oe.quotation = 'f' OR oe.quotation IS NULL) AND NOT oe.closed

comment:6 Geändert vor 14 Monaten durch s.schoeling@…

Ich lasse den Bug mal offen für späteres testen.

Zuletzt geändert vor 14 Monaten von s.schoeling@… (vorher) (Diff)

comment:7 Geändert vor 14 Monaten durch s.schoeling@…

Neue Version, die einige bugs noch behebt:

SELECT oi.id

FROM orderitems oi LEFT JOIN (

SELECT rl.from_id as oid, doi.parts_id, sum(doi.qty) FROM (

SELECT from_id, to_id
FROM record_links rl
LEFT JOIN oe ON oe.id = from_id
WHERE

rl.from_table = 'oe' AND
rl.to_table = 'delivery_orders' AND

oe.customer_id IS NOT NULL AND
(oe.quotation = 'f' OR oe.quotation IS NULL) AND NOT oe.closed

) rl
LEFT JOIN delivery_order_items doi ON (rl.to_id = doi.delivery_order_id)
GROUP BY rl.from_id, doi.parts_id

) agg ON (agg.oid = oi.trans_id AND agg.parts_id = oi.parts_id)
LEFT JOIN oe ON oe.id = oi.trans_id
WHERE

EXISTS (

SELECT to_id
FROM record_links rl
WHERE oi.trans_id = rl.from_id AND rl.from_table = 'oe' AND rl.to_table = 'delivery_orders'

) AND
coalesce(sum, 0) < oi.qty AND
oe.customer_id IS NOT NULL AND
(oe.quotation = 'f' OR oe.quotation IS NULL) AND NOT oe.closed

comment:8 Geändert vor 14 Monaten durch s.schoeling@…

letzte version live, in cetaq und von peter getestet. committe das

comment:9 Geändert vor 14 Monaten durch s.schoeling@…

  • Lösung auf fixed gesetzt
  • Status von new nach closed geändert

schliesse den bug erstmal, wenn was ist, bitte hier wieder öffnen.

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