Ein erfolgreicher Tag der Optimierungen liegt hinter dem Projekt! Ein wesentlicher Punkt, der mich an den Statistiken gestört hatte, waren die relativ langen Ladezeiten, vor allem auf der "Overview" Seite. Ich habe mich zunächst im Profiling geübt und versucht, die Gründe dafür näher zu identifizieren, und konnte schnell feststellen, dass die Abfragen an die Datenbank den Großteil der Ladezeit ausgemacht haben. Insofern stand vor allem die Optimierung der Datenbankabfragen auf dem Plan.
So war der Stand vor dem radikalen Umbau der Statistiken, welche aus sehr vielen einzelnen Abfragen bestanden haben:
So war der Stand vor dem radikalen Umbau der Statistiken, welche aus sehr vielen einzelnen Abfragen bestanden haben:
37 Database Queries, 2894.66 ms Query time 3246 ms Total execution time, 86 ms Symfony initialization 20.00 MiB Peak memory usage
Ich habe viele einzelne und redundante Datenbankabfragen zusammengeführt, sodass große Statistikdaten nicht mehr mehrfach unnötig aus der Projektionstabelle gelesen werden müssen. Außerdem wurde die bisherige künstliche Datumsgrenze in den Abfragen entfernt, damit Abfragen ohne spezifischen Zeitraum sauberer und effizienter funktionieren. Zusätzlich wurden Materialized Views eingeführt, um häufig benötigte Übersichten wie Krankenhaus-, Bereichs- und Scope-Daten vorberechnet zu speichern. Dadurch müssen bestimmte komplexe Aggregationen beim Aufruf der Seite nicht mehr live über Millionen Datensätze erzeugt werden. Zusätzlich wurden die Dashboard-Metriken in zentrale Query-Klassen ausgelagert und gebündelt, sodass wichtige Kennzahlen wie Summen, Geschlechterverteilungen oder Dringlichkeitsverteilungen in deutlich weniger Datenbankzugriffen geladen werden.
Und das Ergebnis kann sich sehen lassen:
27 Database Queries, 556.87 ms Query time 816 ms Total execution time, 33 ms Symfony initialization 10.00 MiB Peak memory usage
Durch meine Maßnahmen konnte die Dauer der Datenbankabfragen um knapp 80 % reduziert werden und die Ladezeit fällt so kaum noch ins Gewicht. Ein riesiger Schritt nach vorn! 🥳