L'Eliminazione delle Tabelle in MariaDB
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 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
- Questa pagina si basa sul seguente post: http://s.petrunia.net/blog/?p=58
Content reproduced on this site is the property of its respective owners,
and this content is not reviewed in advance by MariaDB. The views, information and opinions
expressed by this content do not necessarily represent those of MariaDB or any other party.