Ottimizzazioni delle semi-join
Contents
MariaDB usa una serie di ottimizzazioni specificamente pensate per le subquery di tipo.
Cos'è una subquery semi-join
Una subquery semi-join ha la seguente forma:
SELECT ... FROM tabelle_esterne WHERE espr IN (SELECT ... FROM tabelle_interne ...) AND ...
Quindi la subquery è una subquery "IN" e si trova nella clausola WHERE. E' importante ricordare che con le subquery semi-join, i record nelle tabelle esterne ci interessano solo se corrispondono alla subquery. Vediamo perché è importante. Si consideri questa semi-join:
select * from Country where Continent='Europe' and Country.Code in (select City.country from City where City.Population>1*1000*1000);
Si potrebbe eseguirla "naturalmente", iniziando dagli stati (country) in Europa e controllando se hanno città (Cities) popolose:
La proprietà semi-join permette anche l'esecuzione inversa: iniziare dalle grandi città e leggere in quali città si trovano:
Per notare il contrasto, trasformiamola in una subquery non-semi-join:
select * from Country where Country.Continent='Europe' and (Country.Code in (select City.country from City where City.Population>1*1000*1000) or Country.SurfaceArea > 100*1000 -- Added this part );
E' ancora possibile iniziare dagli stati per poi leggere
- se uno stato ha grandi città
- se ha una grande superficie
Il percorso opposto, dalle città agli stati, non è possibile: non è una semi-join.
Differenze tra le semi-join e le join
Le operazioni semi-join sono simili alle normali join relazionali.Vi è però una differenza: con le semi-joins, non si è interessati a quante corrispondenze si trovano in una tabella interna. Nell'esempio sopra la Germania verrebbe restituita una sola volta anche se avesse tre città con una popolazione superiore a un milione.
Ottimizzazioni delle semi-join in MariaDB
MariaDB usa alcune ottimizzazioni per eseguire le subquery IN a partire dalla versione 5.3. Da MariaDB 5.3.3, queste ottimizzazioni sono abilitate per default. E' possibile disabilitarle impostando a off il relativo flag in optimizer_switch, in questo modo:
SET optimizer_switch='semijoin=off'
MariaDB ha cinque diverse strategie per l'esecuzione delle semi-join:
- L'ottimizzazione Table pullout
- La strategia FirstMatch
- Semi-join Materialization execution strategy
- La strategia LooseScan
- La strategia DuplicateWeedout
- La strategia Semi-join Materialization