La prima cosa che fa l'ottimizzatore di MariaDB è un merge tra la definizione della vista e la query:
select ACRAT_rating from ac_anchor left join ac_name on ac_anchor.AC_ID=ac_name.AC_ID left join ac_dob on ac_anchor.AC_ID=ac_dob.AC_ID left join ac_rating on (ac_anchor.AC_ID=ac_rating.AC_ID and ac_rating.ACRAT_fromdate = (select max(sub.ACRAT_fromdate) from ac_rating sub where sub.AC_ID = ac_rating.AC_ID)) where ACNAM_name='Gary Oldman'
E' importante capire che la query ottenuta ha una parte inutile:
left join ac_dob on ac_dob.AC_ID=...estrae esattamente un record:primary key(ac_dob.AC_ID)garantisce che ci sia al massimo una corrispondenza per ciascun valore diac_anchor.AC_ID,- e se una corrispondenza non c'è,
LEFT JOINgenera una "riga" contenente valori NULL
- ma non ci interessa il record corrispondente, perché
ac_dobnon è usato in altre parti della query.
Questo significa che la parte left join ac_dob on ... può essere rimossa dalla query senza problemi, ed è questo che fa l'Eliminazione delle Tabelle. La logica della ricerca di tabelle da eliminare è piuttosto intelligente, per esempio sarebbe capace di rimuovere anche left join ac_rating on ... , insieme alla subquery (nell'esempio sopra non verrà rimossa perché ac_rating è presente nella lista dei campi da selezionare). Il modulo Table Elimination è anche in grado di gestire Outer Join annidate e Outer Join multi-tabella.
Vedi anche
- Questa pagina si basa sul seguente post: http://s.petrunia.net/blog/?p=58
Commenti
Sto caricando i commenti......