Sok helyen olvastam már, hogy az or
helyett használjunk union
t.
Bár a logikáját értem: az or
nem tudja teljesen kihasználni az indexeket, míg a union
két (vagy több) része meg igen. De azért álljon meg a fáklyásmenet! Itt is először gondolkozni kell, csak aztán alkalmazni!
Lássuk ezt a példát:
select * from tabla where mezo = 'ole' or mezo = 'nana'
Ebben az esetben gyakorlatilag ezt írtuk:
select * from tabla where mezo in ('ole', 'nana')
Ha ugyanezt unionnal szeretnénk:
select * from tabla where mezo = 'ole'
union all
select * from tabla where mezo = 'nana'
Ha kipróbáljuk, rájövünk, hogy a union
ebben az esetben nem gyorsabb, sőt, akár lassabb is lehet. Egyszerűen azért, mert a fenti kijelentés (az or
nem tudja teljesen kihasználni az indexeket) nem igaz. Teljesen ki tudja használni.
Ellenben, ha egy ilyen írnánk:
select * from tabla where mezo = 'ole' or masimezo = 'nana'
Akkor egyértelmű, hogy a unionos
párja:
select * from tabla where mezo = 'ole'
union all
select * from tabla where masikmezo = 'nana'
gyorsabb lesz. Mégpedig azon egyszerű oknál fogva, hogy most az or
valóban nem biztos, hogy ki tudja használni az indexeket, mert más – más mezők szerepelnek a feltételben.
A union
ezzel szemben szépen ki tudja használni, ha van két külön indexünk az mezo-re és a masikmezo-re, ezért gyorsabb lesz.
Tehát ismét az derült ki, hogy nem szabad egy problémát annyira leegyszerűsíteni, hogy rossz következtetést vonjunk le belőle.
Az or
lehet gyorsabb, mint a union
és ez fordítva is igaz. Az adott helyzet adja meg, hogy mikor melyikkel tudunk még pár ezredmásodpercet nyerni a lekérdezésnél.