Tengo una situación de unión de base de datos común que involucra tres tablas. Una tabla, A, es la tabla principal con una clave principal llamada id
. Las tablas B y C contienen datos auxiliares para las entradas y A, y cada una también tiene una columna llamada id
que es una clave externa que apunta a A. id
. Ahora, si quiero todos los datos de A, B y C en una consulta, me gustaría escribir:Agregar condiciones de unión a redudant en Oracle da como resultado un plan diferente
SELECT *
FROM A
INNER JOIN B
ON B.id = A.id
INNER JOIN C
ON C.id = A.id
que por supuesto funciona perfectamente.
Recientemente, nuestro DBA nos dijo que esto es ineficaz en Oracle, y que necesita para unirse a las condiciones entre C y B, así, de la siguiente manera:
SELECT *
FROM A
INNER JOIN B
ON B.id = A.id
INNER JOIN C
ON C.id = A.id AND C.id = B.id
esto parecía redundante para mí, así que naturalmente yo no no creo aquí Hasta que en realidad encontré una consulta lenta que tenía un plan de ejecución terrible, y logré solucionarlo agregando exactamente la condición de combinación faltante. Ejecuté el plan de explicación en ambas versiones: el que no tenía la condición de consulta "redundante" tenía un costo de 1 035, mientras que el "mejorado" tenía 389 (y también había enormes diferencias en la cardinalidad y los bytes). Ambas consultas produjeron exactamente el mismo resultado.
¿Alguien puede explicar por qué esta condición adicional hace la diferencia? Para mí, C y B ni siquiera están relacionados. Tenga en cuenta también que si quita la otra condición de unión, es igual de malo: ambos necesitan estar allí.
Estoy de acuerdo contigo Gary: si el plan es mejor con condiciones de combinación redundantes, es porque las estadísticas son inexactas. En general, NO debes proporcionar información redundante. –
Esta es la respuesta más convincente para mí, porque restaura algo de esperanza en Oracle. (Entonces sí, estoy un poco injustamente parcializado.) Ya sea que sea la explicación real, es difícil que alguien responda. – waxwing