Come posso impedire che UNPIVOT venga trasformato in UNION ALL?


13

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:

ok piano

Ecco la stessa logica quando eseguita come parte dell'intera query:

cattivo piano

I colori corrispondono alle stesse tabelle in entrambi gli screenshot. Per la query lenta, Oracle sta eseguendo una MERGE JOINtra 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 UNPIVOTtesto della query viene trasformato in un UNION ALLpiano. 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 UNPIVOTto 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.


1
Nel tuo esempio unione esiste tutto quindi mostra. Ho eseguito la mia query che non ha un sindacato tutto e spiega che il piano non mostra un sindacato tutto. Quindi, forse è la tua query e non l'operazione di non pivot che sta causando il problema qui?
Raj,

@Raj Il punto è disabilitare quella trasformazione senza modificare il testo della query al fine di restringere ulteriormente il problema.
Joe Obbish,

3
Lavoro con Oracle da molti anni, ma a volte ho bisogno di vedere la query o almeno una pseudo query compatibile con le tue colonne / tabelle sostituite. senza il quale posso continuare a indovinare ma non è né utile a te né a me.
Raj,

Risposte:


1

Prova il seguente suggerimento su Oracle Optimizer:

NO_EXPAND

Questo suggerimento disabilita l'espansione OR. L'espansione OR trasforma le condizioni OR combinate o gli elenchi IN nella whereclausola in una query composta con il union all.

Non abbiamo il tuo SQL quindi questa è un'ipotesi ma sembra un'opzione praticabile.

Come seconda opzione, poiché ti trovi in ​​un ambiente di sviluppo, puoi provare il suggerimento di Oracle Optimizer:

NO_QUERY_TRANSFORMATION

ma questo suggerimento disabilita tutte le trasformazioni di query che l'ottimizzatore può eseguire oltre alle trasformazioni che l'ottimizzatore può sempre applicare.


O non è la stessa cosa di UNPIVOT. Puoi produrre un semplice esempio che mostra il suggerimento NO_EXPAND che funziona per UNPIVOT? Ho provato questo e non ha funzionato per me.
Joe Obbish,

@JoeObbish - Puoi fornire una versione ridotta del tuo SQL complesso con UNPiVOT, per favore? Vorrei aiutarti se posso ...
tale852150

1
@JoeObbish - risposta aggiornata con un altro suggerimento. Spero che sia di aiuto.
tale852150,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.