Llevo unas semanas peleándome con un dashboard que se vuelve muy lento cuando los usuarios aplican varios filtros a la vez. En el backend, la consulta principal usa una unión lateral para traer datos relacionados, y aunque en desarrollo funcionaba bien, con los datos reales todo se atasca. Me pregunto si el problema está en cómo estamos usando esa cláusula o si deberíamos replantear la estructura de la consulta desde cero.
|
Por qué una unión lateral podría estar ralentizando mi dashboard con filtros?
|
|
Esto huele a que la unión lateral está haciendo explotar el plan de ejecución cuando encadenan filtros. En desarrollo todo parecía funcionar, pero con datos reales cada fila dispara subconsultas repetidas. Quizá el problema no es la lógica, sino la cantidad de trabajo que se reparte entre filas y filtros. ¿Qué pasaría si probamos otra estrategia o preprocesamos los datos antes de ese UNION LATERAL?
Empieza por mirar el plan de ejecución y los stats. Con EXPLAIN ANALYZE puedes ver si el UNION LATERAL está causando nested loops o búsquedas duplicadas. Asegura índices sobre columnas usadas en filtros y considera mover los filtros antes del join lateral para reducir la cardinalidad.
Puede que el problema no sea esa cláusula en sí, sino cómo se trae la información. A veces el UNION LATERAL solo revela cuánta data se envía al front, no es el culpable principal. No te vuelvas fan de una solución sin medir.
Antes de optimizar, prueba a descomponer: vistas materializadas o agregaciones previas, o incluso descomponer la consulta en pasos y traer sólo lo necesario. Si el dashboard necesita varias vistas, quizá una estructura que evite el UNION LATERAL por completo.
Como lector que se fija en la claridad, me pregunto si la interfaz deja a los usuarios con demasiados filtros a la vez; tal vez simplificar o dejar agrupaciones ya hechas mejore la experiencia sin tocar la SQL.
Podría haber un cuello de botella en la I/O o en el motor; tal vez introducir un caché de resultados para filtros comunes o un modelo de datos OLAP podría ayudar.
|
|
« Tema anterior | Tema siguiente »
|

