Performance for Schleife - Alternative?
Folgendes Problem:
Ich möchte eine Auswertung erstellen, wo oft ein Produkt aus einer Artikelliste in den Bestellungen eines bestimmten Zeitraums gekauft wurde.
Einziger Ansatz, der mir einfiel: In einer leeren Tabelle werden genauso viele Datensätze erstellt, wie es Produkte gibt. Mit
for p in select Artikelliste do
let my_record := (create Auswertung);
my_record.(Anzahl := cnt(select 'Bestellungen' where Artikel.Nr = p.Nr));
my_record.(Bezeichnung := p.Bezeichnung);
end
("Artikel" ist die Verknüpfung in den Bestellungen zur Artikelliste)
Vor einer erneuten Auswertung werden dann alle alten Datensätze der letzten Auswertung gelöscht. Inhaltlich funktioniert das perfekt. Die Zahlen und die angezeigte Produkte stimmen.
Haken ist nur, dass das Erzeugen der neuen Datensätze mit der for-Schleife extrem langsam läuft, will heißen 1s pro Datensatz bei derzeit 15 Datensätze. Das läuft wie im Daumenkino, bis die Tabelle mit der Auswertung komplett steht. und es liegt bestimmt nicht an meinem Rechner oder der Internetverbindung zur Cloud.
Ist das bei NinoxDB normal und wenn ja, hat jemand eine bessere Idee wie ich eine Prüfung aller Artikeldatensätze über alle Bestellungsdatensätze mit der Summierung erzeugen könnten?
Danke vorab.
3 Antworten
-
Ändere deinen code wie folgt:
–––
do as server
for p in select Artikelliste do
let my_record := (create Auswertung);
my_record.(Anzahl := cnt(select 'Bestellungen' where Artikel.Nr = p.Nr));
my_record.(Bezeichnung := p.Bezeichnung);
end
end
–––
-
Danke. Kannst du mir bitte noch den Hintergrund erklären? Hilft beim Verstehen und Anwenden. Danke.
-
do as server
[...]
endtut genau dies. Es fürhrt code auf dem Server aus. Ansornsten würde jede Schleifendurchlauf einen weiteren Server-Aufruf erzeugen, jedes Mal müsste die antwort des Servers abgewartet werden... Funtktion verbessert die Performance um das 10-100-fache.
Birger
Content aside
- vor 5 JahrenZuletzt aktiv
- 3Antworten
- 1485Ansichten