SELECT <select-list> FROM Gi WHERE <where-clause>Dove <select-list> e' un insieme di attributi globali:
Q_1: select name,dept
from University_Person
where faculty = 'CS'
and (pay >2000000)
Per la query Q_1 viene determinato l'insieme
,
che costituisce il punto di partenza per i passi successivi.
Per ricostruire una base extension si deve effettuare il join tra tutte le classi locali che la compongono, ma le base extension rappresentano insiemi disgiunti di entità, quindi dal join tra le classi si ottiene in realtà un soprainsieme della base extension desiderata.
Quindi si possono, anzi si
devono, non prendere in considerazione le base extension dominate,
ma si devono ricostruire solo quelle dominanti per evitare
duplicazioni.
Di conseguenza sfruttando la definizione precedente, si ottiene l'insieme di
base extension dominate:
Per la query di esempio Q_1, l'insieme di base extension iniziali
viene semplificato in
, infatti, rispetto
all'insieme di attributi della query, si vede che la 6 domina sia la 1 che la
2,
mentre la 7 domina la 2.
Dobbiamo quindi ricostruire solo la base extension 6 e 7.
Scartando le base extension dominate da altre abbiamo notevolmente limitato le possibilità di duplicazioni, ma non le abbiamo eliminate del tutto. Nel caso infatti che due base extension ne dominino una terza, questa viene scartata, ma le altre due una volta ricostruite generano insiemi di entità parzialmente sovrapposti: la sovrapposizione è rappresentata proprio dall'estensione della base extension eliminata. Per ovviare a ciò è necessario tenere traccia ,nel query plan, di come unire le base extension per una determinata Basic Query: di default bisognerà effettuare una unione delle entità, ma se si presenta un caso come quello appena discusso bisognerà effettuare un outer join tra le base extension al fine di presentare una sola volta la porzione comune. Nel nostro esempio Q_1 entrambe le base extension selezionate dominano la 2, di conseguenza in fase di esecuzione devono essere fuse tramite un outer join.
In una base extension potrebbe accadere che due classi locali siano estensionalmente equivalenti, se questo accade e nessuna delle due classi aggiunge informazioni rispetto all'altra puo' essere eliminata una delle due in modo indifferente.Se invece una classe contiene attributi della query non presenti nell'altra deve essere eliminata la seconda.
Un'altro caso in cui é possibile minimizzare l'insieme di classi locali,
si verifica quando due classi appartengono allo stesso DataBase ed esiste
fra loro una relazione di specializzazione: se la sorgente é 'object' o se
in ogni caso la classe specializzata contiene tutte le proprietá
richieste, é possibile scrtare la superclasse.
Nell'esempio introdotto, la base extension 6 prevede l'interrogazione delle
seguenti classi locali
, come si puo' vedere questo insieme non puó essere ulteriormente
ridotto in quanto non ricorre uno dei due casi visti in precedenza.
La base extension 7 prevede inizilamente
, in
questo caso School_Member e University_Student
risultano estensionalmente equivalenti e nessuna delle due aggiunge
informazioni rispetto all'altra , quindi una delle due puó essere
eliminata indifferentemente, ma eliminanado University_Student si
evita di accedere alla terza sorgente, Tax_Position.
L'insieme ottimo di classi a cui inviare le Local Query risulta essere:
.
Prima di eseguire la fase di semplificazione delle classi locali,
devono essere eventualmente aggiunti alla <
select-list
della query,
gli attributi aggiuntivi per la fusione delle base extension.
Per due base extension da
fondere in outer join, é necessario indiviaduare una chiave comune o, nel
caso in cui il join diretto non sia possibile, una classe di collegamento.
Per questo é necessario considerare, per determinare l'insieme ottimo
delle classi locali, non solo gli attributi originari della query, ma anche
eventuali attributi aggiuntivi necessari alla fusione.