Tengo una consulta de Oracle algo compleja que está tardando aproximadamente media hora en completarse. Si tomo la parte lenta de la consulta y la ejecuto por separado, finaliza en unos segundos. Aquí hay una captura de pantalla del informe del Monitor SQL para la consulta aislada:
Aquí está la misma lógica cuando se ejecuta como parte de la consulta completa:
Los colores corresponden a las mismas tablas en ambas capturas de pantalla. Para la consulta lenta, Oracle está haciendo MERGE JOIN
entre dos tablas que no tienen una condición de igualdad en el JOIN
. Como resultado de eso, se procesan innecesariamente alrededor de 150 millones de filas intermedias.
Puedo solucionar este problema con sugerencias de consulta o reescrituras, pero quiero comprender la mayor parte de la causa raíz que pueda para evitar este problema en el futuro y posiblemente enviar un informe de error a Oracle. Cada vez que obtengo el mal plan, el UNPIVOT
texto de la consulta se transforma en un UNION ALL
en el plan. Para seguir investigando, me gustaría evitar que ocurra esa transformación de consulta. No he podido encontrar un nombre para esta transformación. Tampoco he podido encontrar una sugerencia de consulta o un parámetro de subrayado que lo impida. Estoy probando en un servidor de desarrollo, así que todo vale.
¿Hay algo que pueda hacer para evitar la transformación de consulta de UNPIVOT
to UNION ALL
? Estoy en Oracle 12.1.0.2.
No puedo compartir la consulta, los nombres de las tablas o los datos por razones de IP. No pude encontrar una reproducción simple. Dicho esto, no me queda claro por qué esa información es necesaria para responder la pregunta. Aquí hay un ejemplo de una consulta UNPIVOT junto con la misma consulta implementada como UNION ALL.
fuente
Respuestas:
Pruebe la siguiente sugerencia de optimizador de Oracle:
Esta sugerencia desactiva la expansión OR. La expansión OR transforma las condiciones OR combinadas o las listas IN de la
where
cláusula en una consulta compuesta conunion all
.No tenemos su SQL, así que esto es una suposición, pero parece una opción viable.
Como segunda opción, dado que se encuentra en un entorno de desarrollo, puede probar la sugerencia del optimizador de Oracle:
pero esta sugerencia desactiva todas las transformaciones de consulta que el optimizador puede realizar, excepto las transformaciones que el optimizador siempre puede aplicar.
fuente