Ejecutas una consulta para traer una lista, luego recorres las filas y lanzas otra consulta por fila, así que 200 publicaciones se convierten en 201 viajes de ida y vuelta. Se arregla cargando las filas relacionadas en una sola pasada: un join, una consulta IN indexada por id del padre, o un cargador con batching que recoge ids dentro de un mismo tick de la petición. La pista es que la latencia escala de forma lineal con el número de resultados mientras cada consulta individual parece rápida.
Por qué lo preguntan los entrevistadores
Este es el bug de rendimiento más común en aplicaciones con ORM, así que el entrevistador comprueba que lo reconocerías en la vida real y no solo que sabes definirlo. Quieren oír cómo lo detectarías, porque las consultas parecen sanas por separado y lo único que está mal es el número. Mencionar las herramientas que usarías para localizarlo separa a quien lo ha depurado de quien ha leído sobre ello.
Cómo estructurar tu respuesta
- Define el patrón con un número concreto.
- Describe cómo lo detectarías en una aplicación en marcha.
- Da al menos dos soluciones y cuándo aplica cada una.
- Señala la compensación de cargar todo de forma anticipada.
Ejemplo de respuesta
Suele aparecer en cuanto alguien renderiza una lista. Traes pedidos y luego en la plantilla tocas order.customer.name, y el ORM lanza en silencio una consulta por fila. Individualmente son medio milisegundo, así que nada parece roto hasta que la lista crece y el endpoint tarda cuatro segundos. Lo detecto mirando el número de consultas por petición en vez de su duración; la mayoría de herramientas de APM lo muestran directamente, y en local activo el log de consultas y cuento. La solución depende de la forma. Para una relación simple de pertenencia, una carga anticipada o un join va bien. Para una relación de uno a muchos donde un join multiplicaría filas, prefiero una segunda consulta con una cláusula IN y coser en memoria. En una API de GraphQL tiene que ser un dataloader, porque los resolvers no tienen ni idea de que se les está llamando en lote. Lo que evito es cargar todo de forma anticipada por defecto, ya que eso cambia un problema por traerse media base de datos a memoria.
¿Tienes esta entrevista a la vuelta de la esquina? GhostPilot escucha tu llamada en vivo, detecta la pregunta en cuanto la hacen y pone una respuesta estructurada en tu pantalla en tiempo real. Pruébalo en tu próxima entrevista de práctica, o coge un Session Pass de $29, sin suscripción, para la de verdad.
Mira cómo funcionaPreguntas de seguimiento que puedes esperar
- ¿Cómo cazarías esto en CI antes de que llegue a producción?
- ¿Cuándo es un join peor que dos consultas separadas?
- ¿Cómo funciona el batching a lo largo de un árbol de resolvers de GraphQL?
Más preguntas para Desarrollador full stack
Tu entrevistador hará su propia versión de esta. Pega la descripción real del puesto en el Question Predictor gratuito y obtén las 20 preguntas que ese puesto tiene más probabilidades de hacerte, con lo que cada una busca en realidad.
Predecir mis preguntas