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:

semi-join-outer-to-inner

La proprietà semi-join permette anche l'esecuzione inversa: iniziare dalle grandi città e leggere in quali città si trovano:

semi-join-inner-to-outer

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

non-semi-join-subquery

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:

Vedi anche

Commenti

Sto caricando i commenti......