Ottimizzazioni delle semi-join

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......
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.