DiegoEmilio01 / IIC3413

Repositorio del curso Implementación de Sistemas de Bases de Datos
16 stars 1 forks source link

Plan de Joins "left heavy" puede resultar en joins con clausulas vacias #40

Open jtcaraball opened 4 months ago

jtcaraball commented 4 months ago

Hola! Dada la forma en la que que se genera el plan de joins creo que pueden ocurrir cosas raras cómo la siguiente (perdón por la calidad de la foto):

image

No se si es materia del laboratorio que reorganicemos el plan de forma tal que si se pueda filtrar correctamente.

Muchas gracias por todo el apoyo!

cirojas commented 4 months ago

no logro entender cual es la consulta que estás haciendo, puedes escribirla en SQL?

jtcaraball commented 4 months ago

Claro que si:

SELECT *
FROM (R FULL OUTER JOIN S ON R.a == S.x AND R.b == S.y) AS FOJ,
     (S LEFT OUTER JOIN T ON S.x == T.u) AS LOJ,
     T
WHERE FOJ.a == LOJ.x AND LOJ.x == T.u;

Yo estoy ingresando las relaciones y outer joins al CartesianProductPlan en orden Tables > Outer Joins por lo que me queda el "plan" que se ve arriba en la foto.

cirojas commented 4 months ago

Un join no tiene sentido si la lista de condiciones que aplican a las tablas que se unen es vacía, así que en tu caso en vez de armar un join entre T y FOJ, debería ser un producto cruz. Aunque más correcto sería que en BuildJoins se elija un orden de joins que evite productos cruz. Para el laboratorio pueden hacerlo como prefieran, no tiene por que ser eficiente mientras este correcto.

jtcaraball commented 4 months ago

Perfecto. Mil gracias :)

jtcaraball commented 4 months ago

Hola de nuevo, perdón por molestar. Estuve jugando en el branch T5 del repo y es un bug en la aplicación. Aquí hay un ejemplo mínimo replicable.

Screenshot from 2024-07-05 18-54-40

En efecto en BuildJoins se recorren de izquierda a derecha las relaciones y no se ordenan para evitar productos cruz o genera un producto cruz en vez de un join si el orden original generaría un join sin clausulas. Voy a ver si consigo arreglarlo para abrir un PR.

cirojas commented 4 months ago

de hecho hay un bug en una consulta más simple:

SELECT *
FROM S
WHERE S.x == S.y

ya que las condiciones como S.x == S.y no están soportadas por ahora. Pueden asumir que en los tests no aparecerán filtros como ese

jtcaraball commented 4 months ago

Chuta verdad! Aunque creo que cometí un error. El query que mostre en la imagen anterior no era el que corri, la siguiente query es la que causo el error de arriba:

SELECT *
FROM R, S, T
WHERE S.x == T.u AND R.a == T.u
cirojas commented 4 months ago

Tienes razón, hay un bug cuando se intenta hacer joins sin condiciones. El último commit debería arreglarlo: af9e128. Esto se debe a que en una version anterior (no publicada) el build joins armaba joins binarios donde se evitaban los productos cruz. Luego lo cambié pensando en que podría haber una tarea de reordenamiento de joins a futuro.

jtcaraball commented 4 months ago

Muchas gracias!