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 JOIN
Zwischenabfrage 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 UNPIVOT
im Abfragetext in einen UNION ALL
im 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 , UNPIVOT
um 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.
quelle
Antworten:
Versuchen Sie den folgenden Oracle-Optimierungshinweis:
Dieser Hinweis deaktiviert die ODER-Erweiterung. OR-Erweiterung transformiert kombinierte OR-Bedingungen oder IN-Listen in der
where
Klausel in eine zusammengesetzte Abfrage mit demunion 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:
Dieser Hinweis deaktiviert jedoch alle Abfragetransformationen, die das Optimierungsprogramm ausführen kann , mit Ausnahme von Transformationen, die das Optimierungsprogramm immer anwenden kann.
quelle