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:
Voici la même logique lorsqu'elle est exécutée dans le cadre de la requête complète:
Les couleurs correspondent aux mêmes tableaux dans les deux captures d'écran. Pour la requête lente, Oracle effectue une MERGE JOIN
entre 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 UNPIVOT
texte de la requête est transformé en un UNION ALL
dans 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 UNPIVOT
vers 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.
la source
Réponses:
Essayez le conseil d'optimiseur Oracle suivant:
Cette indication désactive l'expansion OR. L'expansion OR transforme les conditions OR combinées ou les listes IN de la
where
clause en une requête composée avec leunion 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:
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.
la source