Comment puis-je empêcher UNPIVOT de se transformer en UNION ALL?

13

J'ai une requête Oracle quelque peu complexe qui prend environ une demi-heure à terminer. Si je prends la partie lente de la requête et l'exécute séparément, elle se termine en quelques secondes. Voici une capture d'écran du rapport SQL Monitor pour la requête isolée:

ok plan

Voici la même logique lorsqu'elle est exécutée dans le cadre de la requête complète:

mauvais plan

Les couleurs correspondent aux mêmes tableaux dans les deux captures d'écran. Pour la requête lente, Oracle effectue une MERGE JOINentre deux tables qui n'ont pas de condition d'égalité dans le JOIN. À la suite de cela, environ 150 millions de lignes intermédiaires sont traitées inutilement.

Je suis capable de contourner ce problème avec des conseils de requête ou des réécritures, mais je veux comprendre autant de la cause racine que possible afin de pouvoir éviter ce problème à l'avenir et éventuellement soumettre un rapport de bogue à Oracle. Chaque fois que je reçois le mauvais plan, le UNPIVOTtexte de la requête est transformé en un UNION ALLdans le plan. Pour approfondir mes recherches, j'aimerais empêcher cette transformation de requête de se produire. Je n'ai pas pu trouver de nom pour cette transformation. Je n'ai pas non plus été en mesure de trouver un indice de requête ou un paramètre de soulignement qui l'empêchera. Je teste sur un serveur de développement donc tout se passe.

Y a-t-il quelque chose que je puisse faire pour empêcher la transformation de requête du UNPIVOTvers UNION ALL? Je suis sur Oracle 12.1.0.2.

Je ne peux pas partager la requête, les noms de table ou les données pour des raisons IP. Je n'ai pas pu proposer une reproduction simple. Cela dit, je ne comprends pas pourquoi ces informations sont nécessaires pour répondre à la question. Voici un exemple de requête UNPIVOT avec la même requête implémentée que UNION ALL.

Joe Obbish
la source
1
Dans votre exemple, l'union existe, donc cela se voit. J'ai exécuté ma propre requête qui n'a pas un syndicat tout et expliquer que le plan ne montre pas un syndicat tout. Alors, c'est peut-être votre requête et non l'opération de pivot qui est à l'origine du problème ici?
Raj
@Raj Le but est de désactiver cette transformation sans modifier le texte de la requête afin d'affiner davantage le problème.
Joe Obbish
3
Je travaille avec Oracle depuis de nombreuses années, mais j'ai parfois besoin de voir la requête ou la pseudo requête compatible au moins avec vos colonnes / tables substituées. sans quoi je peux continuer à deviner mais ce n'est ni utile ni pour moi.
Raj

Réponses:

1

Essayez le conseil d'optimiseur Oracle suivant:

NO_EXPAND

Cette indication désactive l'expansion OR. L'expansion OR transforme les conditions OR combinées ou les listes IN de la whereclause en une requête composée avec le union all.

Nous n'avons pas votre SQL, c'est donc une supposition mais cela semble être une option viable.

Comme deuxième option, étant donné que vous êtes dans un environnement de développement, vous pouvez essayer le conseil d'optimiseur Oracle:

NO_QUERY_TRANSFORMATION

mais cette indication désactive toutes les transformations de requête que l'optimiseur peut effectuer autres que les transformations que l'optimiseur peut toujours appliquer.

conte852150
la source
OU n'est pas la même chose que UNPIVOT. Pouvez-vous produire un exemple simple qui montre le conseil NO_EXPAND fonctionnant pour UNPIVOT? J'ai essayé cela et cela n'a pas fonctionné pour moi.
Joe Obbish
@JoeObbish - Pouvez-vous fournir une version réduite de votre SQL complexe avec l'UNPiVOT, s'il vous plaît? J'aimerais vous aider si je peux ...
tale852150
1
@JoeObbish - réponse mise à jour avec une autre suggestion. J'espère que cela t'aides.
tale852150