Зависи.. Като цяло Oracle не гарантира, че SQL израз ще използва оценка на късо съединение (въпреки че PL/SQL гарантирано извършва оценка на късо съединение). Оптимизаторът на Oracle е свободен да оценява предикатите в какъвто и ред да очаква да бъде най-ефективен. Това може да означава, че първият предикат се оценява първи и само съответстващите редове имат втория предикат, но е напълно възможно да се случи или обратното, или Oracle да трансформира заявката в нещо като UNION
и напълно оценява и двата предиката, преди да комбинира резултатите.
Като се има предвид това, ако оптимизаторът може да определи по време на компилиране, че предикат винаги ще се оценява на TRUE
или FALSE
, оптимизаторът трябва просто да третира това като константа. Така че, ако например има ограничение върху таблицата, което предотвратява X
след като някога има стойност „true“, оптимизаторът изобщо не трябва да оценява втория предикат (въпреки че различните версии на оптимизатора ще имат различни способности да откриват, че нещо е константа по време на компилиране).
Що се отнася до втората част на въпроса ви, без да виждате плановете на заявката, е много трудно да се каже. Оптимизаторът на Oracle е доста добър в трансформирането на заявки от една форма в друга, ако има по-ефективни начини за оценката му. Като цяло обаче, ако subQ
ще върне относително голям брой редове в сравнение с table
, може да е по-ефективно да структурирате заявката като EXISTS
вместо като IN
.