sql >> Database teknologi >  >> RDS >> Oracle

Bruger Oracle kortslutningsevaluering?

Det afhænger af.. Generelt garanterer Oracle ikke, at en SQL-sætning vil bruge kortslutningsevaluering (selvom PL/SQL er garanteret at udføre kortslutningsevaluering). Oracle optimizer er fri til at evaluere prædikaterne i den rækkefølge, den forventer at være mest effektiv. Det kan betyde, at det første prædikat evalueres først, og kun de matchende rækker har det andet prædikat evalueret, men det er fuldt ud muligt, at enten det omvendte sker, eller at Oracle transformerer forespørgslen til en slags UNION og evaluerer begge prædikater fuldt ud, før resultaterne kombineres.

Når det er sagt, hvis optimizeren kan bestemme på kompileringstidspunktet, at et prædikat altid vil evaluere til TRUE eller FALSE , skal optimeringsværktøjet bare behandle det som en konstant. Så hvis der for eksempel er en begrænsning på tabellen, der forhindrer X fra nogensinde at have en værdi på "sand", bør optimeringsværktøjet slet ikke evaluere det andet prædikat (selvom forskellige versioner af optimeringsværktøjet vil have forskellige evner til at registrere, at noget er en konstant på kompileringstidspunktet).

Med hensyn til den anden del af dit spørgsmål, uden at se forespørgselsplanerne, er det meget svært at sige. Oracle optimizer plejer at være ret god til at transformere forespørgsler fra én form til en anden, hvis der er mere effektive måder at evaluere det på. Generelt, men hvis subQ kommer til at returnere et relativt stort antal rækker sammenlignet med table , kan det være mere effektivt at strukturere forespørgslen som en EXISTS snarere end som en IN .



  1. MySQL (eller PHP?) grupperer resultater efter feltdata

  2. Brug MySQL Relational Databases på Ubuntu 10.10 (Maverick)

  3. 6 måder at vælge dublerede rækker i Oracle

  4. hvordan laver man forbindelsespooling i java?