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 di ac_anchor.AC_ID,
    • e se una corrispondenza non c'è, LEFT JOIN genera una "riga" contenente valori NULL
  • ma non ci interessa il record corrispondente, perché ac_dob non è 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

Commenti

Sto caricando i commenti......