SQL JOIN – aggiornamento

venerdì 8 maggio 2009 alle 08:48 | Pubblicato su SQL | Lascia un commento
Tag: , ,

Quasi due anni fa ho scritto un post sui Join in Oracle. Tre giorni fa Jonathan Lewis ha scritto sul suo blog un post intitolato “Dependent Plans” in cui descrive una query per ottenere tutti i piani di esecuzione in cache di query che riferiscono oggetti dipendenti da un particolare oggetto specificato; nel descrivere la query Lewis cita il meccanismo del “lateral join” e mette un link a un suo vecchio post intitolato “Lateral LOBs“, che parla in realtà di lateral views . In questo post viene descritta un’interessante funzione per estrarre un lob a pezzi di varchar2. Jonathan rimanda per la definizione di lateral views a un post del blog “Inside the Oracle Optimizer” intitolato “OuterJoins in Oracle“.

Sono due giorni che studio tutti questi post e i link che ho trovato nei commenti per capire bene il concetto di lateral view. Uno dei link citati rimanda a un post di Jonathan Gennick del 2002 intitolato “What’s in a Condition?” che da un indicazione su come intendere il concetto di join per comprendere meglio i diversi risultati che si possono avere sulle outer join spostando delle condizioni dalla sezione “ON” della join alla sezione “WHERE”. Ebbene, il punto è  che come spiegano quel gruppo di sviluppo dell’ottimizzatore Oracle, almeno in Oracle, le clausole inserite nella parte ON sono valutate prima della JOIN, quelle nella WHERE dopo.

Confrontando però gli esempi che portai quasi due anni fa nel mio post sulle join con la spiegazione di JOIN non riuscivo a capire bene:

SVILUPPO40@perseo10 > create table a (num number);

Tabella creata.

SVILUPPO40@perseo10 > create table b (num number);

Tabella creata.

SVILUPPO40@perseo10 > insert into a values (1);

Creata 1 riga.

SVILUPPO40@perseo10 > insert into b values (2);

Creata 1 riga.

SVILUPPO40@perseo10 > select * from a full outer join b on (1=1);

NUM        NUM
———- ———-
1          2

SVILUPPO40@perseo10 > select * from a full outer join b on (1=0);

NUM        NUM
———- ———-
1
2

SVILUPPO40@perseo10 > select * from a,b;

NUM        NUM
———- ———-
1          2

Dalla spiegazione di Gennick non riuscivo a spiegarmi il caso di select * from a full outer join b on (1=0); in cui ho due record. Ebbene, nella sua spiegazione manca un pezzo, perché dal prodotto cartesiano si in questo caso si ottiene una sola riga. Il suo modello funziona bene per left o right outer join, per la full, probabilmente occorre fare una estensione. Un full outer join in effetti può essere vista come l’unione di una left outer join e una right outer join,  e questa forse è sufficente e corretta come precisazione del modello mentale. Nel mio caso la condizione (1=0) sempre falsa fa eliminare l’unico record risultante dal prodotto cartesiano, quindi subentra il punto 3. dell’articolo di Gennick, che va applicato prima per una tabella e poi per l’altra.

L’articolo di “Inside the Oracle Optimizer” è molto interessante ed istruttivo, l’unico punto un  po’ vago è quello proprio sulle “Lateral Views”, che sono un concetto che fa parte di qualche standard SQL (secondo il manuale SQL Foundation 2003) e in Oracle è implementato tramite la funzione “TABLE” che in sostanza serve a tirare fuori gli elementi da una collection direttamente via SQL, oppure, come mostra Jonathan Lewis nei suoi interessanti esempi, si utilizza con le funzioni “PIPELINED” (ne ho parlato qui).

About these ads

Lascia un commento »

RSS feed dei commenti a questo articolo. TrackBack URI

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Blog su WordPress.com. | The Pool Theme.
Entries e commenti feeds.

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 71 follower

%d blogger cliccano Mi Piace per questo: