Domanda

Per divertimento ho giocare stato con il built-in di oggi Optimizer per Oracle in Toad. Una delle ottimizzazioni che suggerisce è la seguente

AND emp.pay_type = NVL('FT', UID)

Al posto di

AND emp.pay_type = 'FT'

Sono confuso su ciò che sta accadendo qui e causa di esso, confuso su anche sul perché questo sarebbe migliorare le prestazioni. Dal momento che FT è un letterale stringa all'interno della query SQL e quindi mai NULL, perché dovrebbe fare alcuna differenza? Sto indovinando che ha qualcosa a che fare con l'Indice esistente sul campo, ma non riesco a trovare nulla nella documentazione Oracle.

È stato utile?

Soluzione

Questo è un consiglio strano. La funzione NVL funziona in questo modo:

NVL(exp1, val1)

Se 'exp1' non è nullo, viene restituito; altrimenti viene restituito 'val1'.

Da 'FT' nell'esempio non può essere NULL, non v'è alcun vantaggio di utilizzare la funzione NVL, e una piccola riduzione delle prestazioni (almeno per l'ottimizzatore di lavoro che NVL è ridondante, forse una penalità di esecuzione se l'ottimizzatore non funziona che NVL è ridondante).

Se la condizione di lettura:

E emp.pay_type = NVL ( "FT", UID)

allora ci potrebbe essere un vantaggio; Qui abbiamo un delimitato identificatore (nome di colonna racchiusa tra virgolette doppie) e il valore della colonna potrebbe forse essere NULL; le assicura di chiamata NVL che NULL viene restituito solo se "FT" è NULL e UID è nullo. UID è, naturalmente, un identificatore regolare.

Si potrebbe avere un senso se la condizione di lettura:

AND emp.pay_type = NVL(UID, 'FT')

Ora, se il valore UID è NULL, quindi un valore di default 'FT' viene utilizzato come pay_type corrispondente.

Altri suggerimenti

mi piacerebbe prendere "suggerimenti per l'ottimizzazione" di rospo con enormi grani di sale. Io li chiamo il metodo del "fucile da caccia" di ottimizzazione - sparare un sacco di differenti bit al bersaglio e vedere che uno di loro colpisce, in qualche modo:)

In ogni caso, la differenza tra

AND emp.pay_type = NVL('FT', UID)

e

AND emp.pay_type = 'FT'

è che nel secondo caso, l'ottimizzatore può utilizzare le statistiche di istogramma sulla colonna (se sono stati raccolti) per ottenere una stima più accurata del numero di righe corrispondenti. Quando viene utilizzato il NVL, tuttavia, l'ottimizzatore (Credo) non rileva che esso può ignorare la NVL, e pertanto non controlla l'istogramma del valore.

Questo non è un metodo di ottimizzazione avrei generalmente usare. Ci sono modi migliori per controllare il percorso di esecuzione di una query (note, per esempio). In particolare, questo metodo potrebbe non riuscire se hanno migliorato il CBO di cercare e codice di ottimizzare ridondante come NVL([literal value],[anything]) a [literal value].

Cosa Oracle di spiegare Piano si raccontano le due query?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top