Depende. Em geral, a Oracle não garante que uma instrução SQL usará avaliação de curto-circuito (embora o PL/SQL tenha a garantia de realizar a avaliação de curto-circuito). O otimizador Oracle é livre para avaliar os predicados na ordem que achar mais eficiente. Isso pode significar que o primeiro predicado é avaliado primeiro e apenas as linhas correspondentes têm o segundo predicado avaliado, mas é perfeitamente possível que o inverso aconteça ou que o Oracle transforme a consulta em uma espécie de
UNION
e avalia totalmente ambos os predicados antes de combinar os resultados. Dito isto, se o otimizador puder determinar em tempo de compilação que um predicado sempre será avaliado como
TRUE
ou FALSE
, o otimizador deve tratar isso apenas como uma constante. Portanto, se, por exemplo, houver uma restrição na tabela que impeça X
de nunca ter um valor de 'true', o otimizador não deve avaliar o segundo predicado (embora versões diferentes do otimizador tenham diferentes habilidades para detectar que algo é uma constante em tempo de compilação). Quanto à segunda parte da sua pergunta, sem ver os planos de consulta, é muito difícil dizer. O otimizador Oracle tende a ser muito bom em transformar consultas de um formulário para outro se houver maneiras mais eficientes de avaliá-lo. Em geral, no entanto, se
subQ
vai retornar um número relativamente grande de linhas em comparação com table
, pode ser mais eficiente estruturar a consulta como um EXISTS
em vez de um IN
.