Ich habe eine ziemlich komplexe Oracle-Abfrage, die ungefähr eine halbe Stunde in Anspruch nimmt. Wenn ich den langsamen Teil der Abfrage nehme und separat ausführe, ist sie in wenigen Sekunden abgeschlossen. Hier ist ein Screenshot des SQL Monitor-Berichts für die isolierte Abfrage:
Dies ist die gleiche Logik, wenn sie als Teil der vollständigen Abfrage ausgeführt wird:
Die Farben entsprechen den gleichen Tabellen in beiden Screenshots. Für die langsame Abfrage führt Oracle eine MERGE JOINZwischenabfrage zwischen zwei Tabellen durch, in denen keine Gleichheitsbedingung vorliegt JOIN. Infolgedessen werden ungefähr 150 Millionen Zwischenzeilen unnötig verarbeitet.
Ich bin in der Lage, dieses Problem mit Abfragetipps oder Neuschreibungen zu umgehen, aber ich möchte so viel wie möglich von der Grundursache verstehen, damit ich dieses Problem in Zukunft vermeiden und möglicherweise einen Fehlerbericht an Oracle senden kann. Jedes Mal, wenn ich den schlechten Plan erhalte, wird der UNPIVOTim Abfragetext in einen UNION ALLim Plan umgewandelt. Zur weiteren Untersuchung möchte ich verhindern, dass diese Abfragetransformation stattfindet. Ich konnte keinen Namen für diese Umwandlung finden. Ich konnte auch keinen Abfragehinweis oder Unterstrich-Parameter finden, der dies verhindert. Ich teste auf einem Entwicklungsserver, also ist alles möglich.
Gibt es etwas , dass ich die Abfrage Transformation des zu verhindern , kann tun , UNPIVOTum UNION ALL? Ich bin auf Oracle 12.1.0.2.
Ich kann die Abfrage, die Tabellennamen oder die Daten aus IP-Gründen nicht freigeben. Ich konnte mir keine einfache Reproduktion einfallen lassen. Trotzdem ist mir nicht klar, warum diese Informationen zur Beantwortung der Frage benötigt werden. Hier ist ein Beispiel für eine UNPIVOT-Abfrage zusammen mit derselben Abfrage, die als UNION ALL implementiert ist.

