Ich bin auf der Suche nach Ideen zur Verbesserung eines Berichts, der bis zu 30 Minuten für die Verarbeitung auf dem Server benötigt. Ich arbeite derzeit mit Django und MySQL, aber wenn es eine Lösung gibt, die die Sprache oder SQL-Datenbank ändern muss bin offen dafür.Wie verbessert man eine Berichtverarbeitungszeit (Django/MySQL)?
Der Bericht, über den ich spreche liest mehrere Excel-Dateien und fügt alle Zeilen aus diesen Dateien in eine Tabelle (die Berichtstabelle) mit einem Bereich von 12K bis 15K Datensätze, die Tabelle hat etwa 50 Spalten. Dieser Teil braucht nicht so viel Zeit.
Nachdem ich alle Aufzeichnungen über den Bericht Tabelle I mehrere Phasen der Geschäftslogik beginnen Anwendung, damit ich so etwas wie dieses Ende:
def create_report():
business_logic_1()
business_logic_2()
business_logic_3()
business_logic_4()
Jede Funktion des business_logic_X tut etwas sehr ähnlich, es beginnt mit einer ReportModel.objects.all()
und dann wendet es mehrere Berechnungen wie Daten, Mengen, etc. überprüfen und aktualisiert den Datensatz. Da es sich um eine 12K-Datensatztabelle handelt, wird dem gesamten Bericht schnell Zeit hinzugefügt.
Der Grund, warum ich mehrere Funktionen getrennt und keine gesamte Verarbeitung in einem Durchgang gehe, ist, weil die Logik von der ersten Funktion abgeschlossen werden muss, damit die Logik auf den nächsten Funktionen funktioniert (zB die erste Funktion findet alle zugehörigen Datensätze und wendet den gleichen Status für alle von ihnen an.
Das erste Ding, das ich weiß, konnte optimiert werden irgendwie caching das objects.all(), anstatt es in jeder Funktion zu nennen, aber ich bin nicht sicher, wie man es übergibt die nächste Funktion ohne die Datensätze zuerst zu speichern
Ich habe den Bericht bereits ein wenig optimiert, indem ich update_fields für die Speichermethode der Funktionen verwendet habe, und das hat ein wenig Zeit gespart
Meine Frage ist, gibt es einen besseren Ansatz für diese Art von Problem? Ist Django/MySQL der richtige Stack dafür?
Lassen Sie uns die beteiligten SQL sehen. –