Wie kann ich verhindern, dass UNPIVOT in UNION ALL umgewandelt wird?

13

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:

ok plan

Dies ist die gleiche Logik, wenn sie als Teil der vollständigen Abfrage ausgeführt wird:

schlechter Plan

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.

Joe Obbish
quelle
1
In Ihrem Beispiel existiert alles, daher zeigt es. Ich habe meine eigene Abfrage ausgeführt, die nicht alle Gewerkschaften enthält, und Plan zu erklären, zeigt nicht alle Gewerkschaften an. Vielleicht ist es Ihre Abfrage und nicht die Unpivot-Operation, die das Problem hier verursacht?
Raj
@Raj Der Punkt ist, diese Umwandlung zu deaktivieren, ohne den Abfragetext zu ändern, um das Problem weiter einzugrenzen.
Joe Obbish
3
Ich arbeite seit vielen Jahren mit Oracle, aber manchmal muss ich die Abfrage oder zumindest kompatible Pseudo-Abfrage mit Ihren Spalten / Tabellen ersetzt sehen. ohne das ich raten kann, aber es ist weder für dich noch für mich nützlich.
Raj

Antworten:

1

Versuchen Sie den folgenden Oracle-Optimierungshinweis:

NO_EXPAND

Dieser Hinweis deaktiviert die ODER-Erweiterung. OR-Erweiterung transformiert kombinierte OR-Bedingungen oder IN-Listen in der whereKlausel in eine zusammengesetzte Abfrage mit dem union all.

Wir haben Ihr SQL nicht, daher ist dies eine Vermutung, scheint aber eine gangbare Option zu sein.

Als zweite Option können Sie, da Sie sich in einer Entwicklungsumgebung befinden, den Oracle-Optimierungshinweis verwenden:

NO_QUERY_TRANSFORMATION

Dieser Hinweis deaktiviert jedoch alle Abfragetransformationen, die das Optimierungsprogramm ausführen kann , mit Ausnahme von Transformationen, die das Optimierungsprogramm immer anwenden kann.

tale852150
quelle
ODER ist nicht dasselbe wie UNPIVOT. Können Sie ein einfaches Beispiel erstellen, in dem der NO_EXPAND-Hinweis für UNPIVOT angezeigt wird? Ich habe es versucht und es hat bei mir nicht funktioniert.
Joe Obbish
@JoeObbish - Können Sie bitte eine verkleinerte Version Ihres komplexen SQL mit UNPiVOT bereitstellen? Ich möchte Ihnen helfen, wenn ich kann ...
Tale852150
1
@ JoeObbish - aktualisierte Antwort mit einem anderen Vorschlag. Hoffe das hilft.
Tale852150