Záleží na tom..Oracle obecně nezaručuje, že příkaz SQL použije vyhodnocení zkratu (ačkoli PL/SQL zaručeně provede vyhodnocení zkratu). Optimalizátor Oracle může vyhodnotit predikáty v jakémkoli pořadí, které očekává, že bude nejefektivnější. To by mohlo znamenat, že první predikát je vyhodnocen jako první a pouze odpovídající řádky mají vyhodnocený druhý predikát, ale je zcela možné, že se stane buď opak, nebo že Oracle transformuje dotaz na jakýsi UNION
a plně vyhodnotí oba predikáty před spojením výsledků.
Jak již bylo řečeno, pokud optimalizátor dokáže v době kompilace určit, že predikát bude vždy vyhodnocen jako TRUE
nebo FALSE
, měl by to optimalizátor považovat za konstantu. Pokud je tedy například v tabulce omezení, které brání X
z toho, že někdy bude mít hodnotu 'true', neměl by optimalizátor vůbec vyhodnocovat druhý predikát (ačkoli různé verze optimalizátoru budou mít různé schopnosti detekovat, že je něco v době kompilace konstanta).
Pokud jde o druhou část vaší otázky, bez zobrazení plánů dotazů je velmi těžké říci. Optimalizátor Oracle bývá docela dobrý v transformaci dotazů z jednoho formuláře do druhého, pokud existují efektivnější způsoby, jak to vyhodnotit. Obecně však platí, že pokud subQ
vrátí relativně velký počet řádků ve srovnání s table
, může být efektivnější strukturovat dotaz jako EXISTS
spíše než jako IN
.