2010-08-11 51 views
5

Aquí es mi consulta:¿Por qué esta consulta da como resultado un MERGE JOIN CARTESIAN en Oracle?

select count(*) 
from email_prod_junc j 
inner join trckd_prod t5 on j.trckd_prod_sk = t5.trckd_prod_sk 
inner join prod_brnd b on t5.prod_brnd_sk = b.prod_brnd_sk 
inner join email e on j.email_sk = e.email_sk 
inner join dm_geography_sales_pos_uniq u on (u.emp_sk = e.emp_sk and u.prod_brnd_sk = b.prod_brnd_sk) 

La explicar el plan dice:

cartesiana entre DM_GEOGRAPHY_SALES_POS_UNIQ y EMAIL_PROD_JUNC.

No entiendo por qué porque hay una condición de unión para cada tabla.

+4

¿La combinación de unión cartesiana realmente causa problemas de rendimiento o simplemente no espera verla? Si se puede invocar a una de las tablas a las que se une con un pequeño número de filas, combine join cartesian. También la versión de Oracle sería útil ya que los optimizadores se modifican/mejoran mucho de una versión a otra. –

+0

Sí, la consulta tardó más de un minuto en volverse con la unión cartesiana. Una vez que agregué la sugerencia ordenada, regresó en <1s. Este es Oracle 10g. Trckd_Prod y Prod_Brnd son tablas pequeñas, las otras 3 son muy grandes. –

+0

@MarkSherretta: se sabe que el optimizador 10g es escamoso y requiere sugerencias que las versiones posteriores del optimizador no necesitan. 11.1 es bastante sólido - 11.2 mejor. No tengo ninguna experiencia personal con 12, así que no puedo decir cómo está. –

Respuesta

5

he resuelto esto añadiendo la indirecta Z:

select /*+ ordered */ 

me dio la información de here

Si especifica las tablas en el orden que desea que se unieron y utilizar esta sugerencia, Oracle no perder tiempo tratando de averiguar el orden de combinación óptima, se acaba de unirse ellos como están ordenados en la cláusula FROM.

+0

¿Afectará ese cambio el rendimiento? – Allan

+0

Sí, el rendimiento pasó de> 1 minuto a <1 seg. –

0

Me gustaría especular que sucede debido a la condición de encendido (xey) de la última unión interna. Oracle probablemente no sepa cómo optimizar la condición de instrucciones múltiples, por lo que realiza una unión completa, luego filtra el resultado por la condición después del hecho. No estoy muy familiarizado con el plan de explicar de Oracle, así que no puedo decir que con autoridad

Editar

Si quería probar esta hipótesis, se podría intentar cambiar la consulta a:

inner join dm_geography_sales_pos_uniq u on u.emp_sk = e.emp_sk 
where u.prod_brnd_sk = b.prod_brnd_sk 

y ver si se elimina la unión completa del plan

+1

Gracias RMorrisey, pero eso no funcionó, resulta en el mismo plan de ejecución. –

1

Sin conocer sus índices y el plan completo, es difícil decir por qué esto está sucediendo exactamente. Mi mejor opción es que EMAIL_PROD_JUNC y DM_GEOGRAPHY_SALES_POS_UNIQ son relativamente pequeños y que hay un índice en TRCKD_PROD (trckd_prod_sk, prod_brnd_sk). Si ese es el caso, entonces el optimizador puede haber decidido que el cartesiano en las dos tablas más pequeñas es menos costoso que filtrar TRCKD_PROD dos veces.

Cuestiones relacionadas