Ho una query Oracle piuttosto complessa che impiega circa mezz'ora per essere completata. Se prendo la parte lenta della query ed eseguo separatamente, termina in pochi secondi. Ecco uno screenshot del report di SQL Monitor per la query isolata:
Ecco la stessa logica quando eseguita come parte dell'intera query:
I colori corrispondono alle stesse tabelle in entrambi gli screenshot. Per la query lenta, Oracle sta eseguendo una MERGE JOIN
tra due tabelle che non hanno una condizione di uguaglianza in JOIN
. Di conseguenza, circa 150 milioni di file intermedie vengono elaborate inutilmente.
Sono in grado di aggirare questo problema con suggerimenti di query o riscritture, ma desidero comprendere quanto più possibile della causa principale in modo da poter evitare questo problema in futuro e possibilmente inviare una segnalazione di bug a Oracle. Ogni volta che ottengo il piano negativo, il UNPIVOT
testo della query viene trasformato in un UNION ALL
piano. Per ulteriori approfondimenti, vorrei impedire che la trasformazione della query avvenga. Non sono stato in grado di trovare un nome per questa trasformazione. Inoltre non sono stato in grado di trovare un suggerimento per la query o un parametro di sottolineatura che lo impedirà. Sto testando su un server di sviluppo, quindi tutto va bene.
C'è qualcosa che posso fare per impedire la trasformazione della query in UNPIVOT
to UNION ALL
? Sono su Oracle 12.1.0.2.
Non sono in grado di condividere la query, i nomi delle tabelle o i dati per motivi IP. Non sono riuscito a trovare una semplice riproduzione. Detto questo, non mi è chiaro perché tali informazioni siano necessarie per rispondere alla domanda. Ecco un esempio di una query UNPIVOT insieme alla stessa query implementata come UNION ALL.