Suite à la sortie de la 4.82 et aux échanges avec @pierre-gilles sur les perfs de la nouvelle vue Activité sur des installations un peu lourdes (tout du moins comme la mienne), voici le bilan de la PR #2647, testée sur ma base de 448 millions d’états.
Le problème
Sur une grosse base, filtrer l’Activité sur une catégorie clairsemée (ex. « Ouvertures » : peu d’états, anciens) obligeait le serveur à scanner une énorme partie de l’historique avant de répondre : le serveur ne répondait qu’une fois sa page de 80 états remplie, quelle que soit la profondeur à parcourir. Résultat : un spinner figé pendant 20 à 50 secondes, parfois 3 minutes.
On a mesuré méthodiquement toutes les pistes « pur serveur » (fenêtres progressives, ancrage sur la dernière activité — merci @pierre-gilles pour la #2642 —, tranches disjointes, compaction physique de la table) : chacune améliore, aucune ne supprime le mur — le coût plancher, c’est le débit de scan de DuckDB multiplié par le volume à parcourir.
La solution : laisser le client piloter la recherche
Serveur : getDeviceStatesHistory accepte une borne since → une requête = une fenêtre temporelle bornée, qui rend ce qu’elle contient (même moins que 80) et ne s’élargit jamais. Une fenêtre bornée répond en millisecondes grâce aux zone maps DuckDB. Sans since, comportement strictement inchangé (rétro-compatible).
Front : la vue Activité sonde 1 → 2 → 4 → 8 → 16 → 32 mois puis une dernière requête illimitée, affiche chaque lot dès son arrivée, avec un bandeau « Recherche d’activités — mars 2025… » pendant que les fenêtres plus anciennes sont sondées en arrière-plan.
Les mesures (448 M d’états)
Cas
Avant
Après
Filtre « Ouvertures » (peu d’états, anciens)
20 à 33 s de spinner figé
Premiers états en ~100 ms, la page se complète en fond
Filtre « Boutons » (états à 17 mois)
22 à 51 s
Bandeau immédiat indiquant le mois scanné, états dès qu’ils sont trouvés
Vue « Tout » / live / capteurs bavards
~100 ms
Inchangé (~100 ms)
Le travail total du pire cas ne change pas — mais il se fait derrière une page déjà utilisable au lieu de bloquer le premier affichage. C’est le principe du logbook Home Assistant, adapté à l’API Gladys.