Vue Activité : affichage instantané sur les grosses bases (PR #2647)

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.


La PR est prête pour review. Elle ne touche ni au modèle de données, ni aux agrégats — c’est du pur découpage de requêtes.

2 « J'aime »