Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle utilise-t-il l'évaluation des courts-circuits ?

Cela dépend. En général, Oracle ne garantit pas qu'une instruction SQL utilisera une évaluation de court-circuit (bien que PL/SQL soit garanti pour effectuer une évaluation de court-circuit). L'optimiseur Oracle est libre d'évaluer les prédicats dans l'ordre qu'il juge le plus efficace. Cela peut signifier que le premier prédicat est évalué en premier et que seules les lignes correspondantes ont le deuxième prédicat évalué, mais il est tout à fait possible que l'inverse se produise ou qu'Oracle transforme la requête en une sorte de UNION et évalue entièrement les deux prédicats avant de combiner les résultats.

Cela étant dit, si l'optimiseur peut déterminer au moment de la compilation qu'un prédicat sera toujours évalué à TRUE ou FALSE , l'optimiseur doit simplement traiter cela comme une constante. Donc si, par exemple, il y a une contrainte sur la table qui empêche X d'avoir jamais une valeur de 'true', l'optimiseur ne devrait pas du tout évaluer le deuxième prédicat (bien que différentes versions de l'optimiseur aient des capacités différentes pour détecter que quelque chose est une constante au moment de la compilation).

Quant à la deuxième partie de votre question, sans voir les plans de requête, c'est très difficile à dire. L'optimiseur Oracle a tendance à être assez bon pour transformer les requêtes d'un formulaire à un autre s'il existe des moyens plus efficaces de l'évaluer. En général, cependant, si subQ va retourner un nombre relativement important de lignes par rapport à table , il peut être plus efficace de structurer la requête en tant que EXISTS plutôt que comme un IN .