Union vagy or?

Sok helyen olvastam már, hogy az or helyett használjunk uniont.

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.