¿Cómo puedo evitar que UNPIVOT se transforme en UNION ALL?


13

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:

ok plan

Aquí está la misma lógica cuando se ejecuta como parte de la consulta completa:

mal plan

Los colores corresponden a las mismas tablas en ambas capturas de pantalla. Para la consulta lenta, Oracle está haciendo MERGE JOINentre 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 UNPIVOTtexto de la consulta se transforma en un UNION ALLen 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 UNPIVOTto 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.


1
En su ejemplo, la unión existe, por lo tanto, se nota. Ejecuté mi propia consulta que no tiene un sindicato y el plan de explicación no muestra un sindicato. Entonces, ¿tal vez sea su consulta y no la operación no dinámica la que está causando el problema aquí?
Raj

@Raj El objetivo es deshabilitar esa transformación sin cambiar el texto de la consulta para reducir aún más el problema.
Joe Obbish

3
He estado trabajando con Oracle durante muchos años, pero a veces necesito ver la consulta o al menos una pseudo consulta compatible con sus columnas / tablas sustituidas. sin lo cual puedo seguir adivinando, pero no es útil para ti ni para mí.
Raj

Respuestas:


1

Pruebe la siguiente sugerencia de optimizador de Oracle:

NO_EXPAND

Esta sugerencia desactiva la expansión OR. La expansión OR transforma las condiciones OR combinadas o las listas IN de la wherecláusula en una consulta compuesta con union 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:

NO_QUERY_TRANSFORMATION

pero esta sugerencia desactiva todas las transformaciones de consulta que el optimizador puede realizar, excepto las transformaciones que el optimizador siempre puede aplicar.


O no es lo mismo que UNPIVOT. ¿Puedes producir un ejemplo simple que muestre la sugerencia NO_EXPAND que funciona para UNPIVOT? He intentado esto y no me funcionó.
Joe Obbish

@JoeObbish: ¿puede proporcionar una versión reducida de su SQL complejo con UNPiVOT, por favor? Me gustaría ayudarte si puedo ...
tale852150

1
@JoeObbish: respuesta actualizada con otra sugerencia. Espero que esto ayude.
tale852150
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.