Bon, ich habe gerade einige Tests durchgeführt… Und ich würde sagen, dass das Problem sicherlich nicht die Abfragen an DuckDB sind (ich glaube, wir haben diese Art von Tests bereits direkt in der Entwicklung in Gladys durchgeführt ^^). Es muss einfach die Darstellung oder eher der Aufbau der Serien sein…
- Aggregation nach Zeitintervall - TimeBucket-Abfrage
SELECT
device_feature_id,
TIME_BUCKET(INTERVAL 1752 MINUTES, created_at) AS created_at,
AVG(value) AS value,
MAX(value) AS max_value,
MIN(value) AS min_value,
SUM(value) AS sum_value,
COUNT(value) AS count_value
FROM t_device_feature_state
WHERE device_feature_id IN (
'eaa982b7-a3c8-4b4d-b2d0-5a5cf5245938',
'e9079170-4654-4fad-b726-23a36c793905',
'c59fca37-54f3-418b-b27c-857e08e2a0fb',
'da79df66-dcff-438e-859c-39b641fd15e9',
'5eba10ac-4c3a-479c-aba7-a1e74a00d914',
'4b5e90f0-a86b-405b-8ca1-953705ef79a3',
'c92f8fa3-d841-4692-bd3a-e5addb760a73',
'b5445f10-7aa9-41bf-8cae-d2f30498652f',
'08e90478-4bb2-4a08-986f-3d6f212c95f1',
'85311f8c-334f-4b7e-8294-2b841c0b8fe8'
)
AND created_at > TIMESTAMP '2024-12-14 10:04:11.478'
GROUP BY
device_feature_id,
created_at
ORDER BY
device_feature_id,
created_at;
- Aufteilung nach Quantilen - NTILE(300)-Abfrage
WITH intervals AS (
SELECT
device_feature_id,
created_at,
value,
NTILE(300) OVER (
PARTITION BY device_feature_id
ORDER BY created_at
) AS interval
FROM t_device_feature_state
WHERE device_feature_id IN (
'eaa982b7-a3c8-4b4d-b2d0-5a5cf5245938',
'e9079170-4654-4fad-b726-23a36c793905',
'c59fca37-54f3-418b-b27c-857e08e2a0fb',
'da79df66-dcff-438e-859c-39b641fd15e9',
'5eba10ac-4c3a-479c-aba7-a1e74a00d914',
'4b5e90f0-a86b-405b-8ca1-953705ef79a3',
'c92f8fa3-d841-4692-bd3a-e5addb760a73',
'b5445f10-7aa9-41bf-8cae-d2f30498652f',
'08e90478-4bb2-4a08-986f-3d6f212c95f1',
'85311f8c-334f-4b7e-8294-2b841c0b8fe8'
)
AND created_at > TIMESTAMP '2024-12-14 10:04:11.478'
)
SELECT
device_feature_id,
MIN(created_at) AS created_at,
AVG(value) AS value,
MAX(value) AS max_value,
MIN(value) AS min_value,
SUM(value) AS sum_value,
COUNT(value) AS count_value
FROM intervals
GROUP BY
device_feature_id,
interval
ORDER BY
device_feature_id,
created_at;
Ich habe also einen Performance-Test auf dem Dashboard durchgeführt:
ChatGPT-Studie ^^ :
Direkte Lesung deiner Performance-Aufzeichnung
Gesamtzeit
- Gesamt ≈ 13.190 ms (13,2 s)
Verteilung (linkes Panel)
- Anzeige (Rendering) : 2.330 ms
- Darstellung (Paint / Layout) : 791 ms
- Skript (JS) : 563 ms
- Netzwerk-Ladezeit : 27 ms
- System / nicht zugeordnet : ~5.200 ms
- Gesamt „nützlich“ sichtbar : ~4 s
- Große Lücke „nicht zugeordnet / idle / Wartezeit“ : ~9 s
Sofortige Schlussfolgerung :
Es ist weder das Netzwerk,
noch DuckDB,
noch reines JavaScript,
es ist überwiegend Wartezeit, bevor die nützliche Darstellung beginnt.
Fokus auf den Netzwerkteil (wichtig für Gladys)
In deiner rechten Tabelle:
- Abfrage:
aggregated_states (10.5.0.227)
- Übertragene Größe : 213 ko
- Ausführungszeit : ~260 ms
Das bestätigt, was wir vermutet haben:
- Die Backend-Abfrage ist schnell
- Die Payload ist angemessen
- < 300 ms, also kein Problem
Jetzt können wir ohne Zweifel sagen:
Die 10–13 Sekunden kommen nicht von den DuckDB-Abfragen.
Wo gehen dann die ~9 Sekunden verloren?
Laut Flame Chart und Timeline:
„Warte-/nicht zugeordnete“ Phase (~9 s)
Das ist typischerweise:
- Wartezeit auf einen kompletten React-State
- Wartezeit, bis alle Serien bereit sind
- Synchronisation vor dem Rendern des Diagramms
- oder Logik wie:
- „Warten auf alle Promises“
- „Warten, bis X berechnet ist, bevor gerendert wird“
Klassisches Anti-Pattern bei komplexen Dashboards.
„Rendering + Layout“-Phase (~3 s)
Hier sind wir eindeutig bei:
- vielen Punkten
- vielen Serien
- wahrscheinlich:
- Neuberechnung von Skalen
- Neuberechnung von Legenden
- Tooltips
- min/max
- Animationen
Das ist kohärent mit einem jährlichen Multi-Kurven-Diagramm.
Schlussfolgerung (die du bereits formulieren kannst)
Du kannst bereits mit Beweisen sagen:
Die Chrome Performance-Messungen zeigen, dass:
- Die Backend-Abfrage ist < 300 ms
- Die Payload ist ~213 ko
- Das reine JS < 600 ms
Die wahrgenommenen ~13 s sind hauptsächlich auf eine Wartephase + grafische Darstellung auf der Frontend-Seite zurückzuführen.
Die Optimierung muss daher hauptsächlich im React-/Diagramm-Rendering-Pipeline erfolgen, nicht bei DuckDB.
Nächste konkrete Ansätze (wenn du weitergehen möchtest)
Ohne den Code zu sehen, sind die offensichtlichen Hebel:
- Das Diagramm progressiv rendern (Serien eine nach der anderen)
- Die Anzahl der Punkte vor dem Rendern begrenzen (Hard Cap)
- Animationen/Übergänge bei langen Ansichten deaktivieren
- Virtualisierung / reines Canvas, falls noch nicht geschehen