Tras la salida de la 4.82 y las discusiones con @pierre-gilles sobre el rendimiento de la nueva vista de Actividad en instalaciones un poco pesadas (al menos como la mía), aquí está el balance de la PR #2647, probada en mi base de 448 millones de estados.
El problema
En una base grande, filtrar la Actividad en una categoría poco densa (ej. « Aperturas »: pocos estados, antiguos) obligaba al servidor a escanear una enorme parte del historial antes de responder: el servidor solo respondía una vez que su página de 80 estados estaba llena, sin importar la profundidad a recorrer. Resultado: un spinner congelado durante 20 a 50 segundos, a veces 3 minutos.
Se midieron meticulosamente todas las pistas « puramente del servidor » (ventanas progresivas, anclaje en la última actividad — gracias @pierre-gilles por la #2642 —, segmentos disjuntos, compactación física de la tabla): cada una mejora, pero ninguna elimina el muro — el costo mínimo es el rendimiento de escaneo de DuckDB multiplicado por el volumen a recorrer.
La solución: dejar que el cliente controle la búsqueda
- Servidor:
getDeviceStatesHistoryacepta un límitesince→ una consulta = una ventana temporal limitada, que devuelve lo que contiene (incluso menos de 80) y nunca se expande. Una ventana limitada responde en milisegundos gracias a las zone maps de DuckDB. Sinsince, el comportamiento es estrictamente el mismo (retrocompatible). - Frontend: la vista de Actividad sondea 1 → 2 → 4 → 8 → 16 → 32 meses y luego una última consulta ilimitada, muestra cada lote tan pronto como llega, con una banda « Búsqueda de actividades — marzo 2025… » mientras se escanean las ventanas más antiguas en segundo plano.
Las mediciones (448 M de estados)
| Caso | Antes | Después |
|---|---|---|
| Filtro « Aperturas » (pocos estados, antiguos) | 20 a 33 s de spinner congelado | Primeros estados en ~100 ms, la página se completa en segundo plano |
| Filtro « Botones » (estados a 17 meses) | 22 a 51 s | Banda inmediata indicando el mes escaneado, estados tan pronto como se encuentren |
| Vista « Todo » / en vivo / sensores habladores | ~100 ms | Sin cambios (~100 ms) |
El trabajo total del peor caso no cambia — pero se realiza detrás de una página ya utilizable en lugar de bloquear la primera visualización. Es el principio del logbook de Home Assistant, adaptado a la API de Gladys.
La PR está lista para revisión. No toca ni el modelo de datos ni los agregados — es un simple corte de consultas.

