Consulta general sobre costos

Consulta general sobre costos

de Lucia Paola Lemes Coitinho -
Número de respuestas: 3

Buenos días,

He estado leyendo las consultas anteriores realizadas en el foro, pero hay algunos puntos en los que no logro discernir o interpretar cómo se deberían realizar los cálculos. Les pido de antemano disculpas si pregunto algo que ya fue abordado con anterioridad (seguramente sea porque no lo entendí al leerlo).

Mis consultas son las siguientes:

  1. Al definir mi aggregation pipeline, por ejemplo, con tres $lookups y un $project, ¿debo sumar 1 por cada stage (para acceder al doc por _id)? o sea, ¿debemos asumir que el documento de la colección llamada al principio se accede por id en cada stage de manera independiente, o un stage pasa al siguiente su resultado sin necesidad de búsqueda/acceso por parte del receptor (costo de acceso a doc posterior nulo)? En general estaba asumiendo lo segundo, pero la última respuesta de este foro me hizo dudar. Cabe aclarar que las consultas posteriores que realizo asumen lo segundo.
  2. En el caso del $lookup, el mismo accede a un documento en otra colección (tamaño M) y luego compara sus claves (las que se indique). Mi duda es si, además de M/2, ¿debo sumar 0.1*2, teniendo en cuenta el costo de acceder al id de cada documento?
  3. Para el $lookup, el/los documento/s encontrado/s que coincidan sus claves, se embeben en el doc original. En este caso, ¿es razonable considerar el costo de embeber como M*0.01, siendo M la cantidad de campos del esquema de la colección cuyos doc pasan a estar embebidos?, ¿o debo considerar lectura y escritura por separado y hacer M*(0.01)*(2)?
  4. ¿Tiene sentido considerar un $sort (antes de ningún $group) como un costo de 0.01 (para un solo atributo)? Lo pensamos así considerando que el aggregate va a acceder todos los documentos (la pregunta está muy relacionada con el punto 1). En el caso que este $sort esté después del $group, asumo que se deberá multiplicar el 0.01 por la cantidad de grupos.
  5. Respecto del $group, considerando que recorre todos los doc de la colección (relacionado al punto 1), ¿está bien computar el costo de la suma (por ejemplo, al hallar total_sales) como 0.01?
¡Gracias por las respuestas! Disculpen la extensión

Saludos,
En respuesta a Lucia Paola Lemes Coitinho

Re: Consulta general sobre costos

de Martin Giachino -
Intentaré responder todo, espero no olvidarme de ningua.

1 - por definición la salida de un stage se convierte automáticamente en la entrada de la siguiente. Si el acceso es por _id o no dependerá de si los campos del lookup (es decir del join) tienen o no índices definidos. Si no lo tienen, no queda otra que ir recorriendo toda la colección, o si es una etapa del pipeline la colección resultante del stage anterior que puede ser firerente en cantidad a la original.

2 - Coincido en sumar el acceso a los campos para comparar, pero recordad que los campos del lookup no necesariamente son índices de manera que puede que no sea M/X (con X selectividad de ese campo) sino que como en 1 implica recorrer ambas colecciones para hacer el match.

3 - Para ese caso no está mal duplicar el costo, pero no es relevante la decisión que tomes si luego mantenés en mismo criterio para todos los costos que calcules.

4 - Diría que el primer caso no es correcto, ya que si haces un sort sobre un campo de toda la colección entonces deberás recorrer toda la colección. El otro caso sí tiene mas sentido, porque efectivamente podrías ordenar por el campo total por grupo calculado.

5 - Creo que respondí a esto en (4)

Martín
En respuesta a Martin Giachino

Re: Consulta general sobre costos

de Lucia Paola Lemes Coitinho -

Muchas gracias, Martín por la respuesta!

Entiendo que los stages se comparten unos a otros la colección y no documento a documento, así que tendrían que volver a accederlos, ¿es así?

Creo que la mayoría de las dudas quedaron claras. Una cosa que no cubrí al preguntar fue, suponiendo que el lookup (matcheando por clave foránea) embebe más de un documento para cada doc de la colección principal, el costo de ese macheo y embebido lo tendría que multiplicar por la cantidad de documentos que se embeben (por ejemplo, para el caso del lookup entre film y actors, hay varios actores por película, digamos en promedio 5; debería multiplicar por eso, no?). 

Busqué el significado de X (selectividad) y entiendo que refiere a qué tan "único" es el campo por el que se busca. En nuestro caso, por las claves que se usan siempre quedaría M/2, no?

Muchas gracias!

En respuesta a Lucia Paola Lemes Coitinho

Re: Consulta general sobre costos

de Martin Giachino -
Claro, se van generando nuevas colecciones "on the fly" con los filtros y proyecciones computadas hasta el momento.

Sobre la segunda pregunta sí, como bien dices una película tiene varios actores y por eso para tener todas las peliculas con sus actores sería necesario hacer esa multiplicación que tú mencionas.

En realidad no tiene que ser siempre M/2 sino que depende del caso de lo que esa clave/indice identifique. Por ejemplo, en tu comentario anterior hablas de que una película tiene unos 5 actores en promedio, así que si existiera un índice por film_id dentro de los actores la selectividad claramente no sería M/2. Esa es la idea, espero se haya entendido.

Martín