sql >> Databasteknik >  >> RDS >> Oracle

Använder Oracle kortslutningsutvärdering?

Det beror på... I allmänhet garanterar inte Oracle att en SQL-sats kommer att använda kortslutningsutvärdering (även om PL/SQL garanterat utför kortslutningsutvärdering). Oracle-optimeraren är fri att utvärdera predikaten i vilken ordning den än förväntar sig vara mest effektiv. Det kan betyda att det första predikatet utvärderas först och endast de matchande raderna har det andra predikatet utvärderat, men det är fullt möjligt att antingen det omvända händer eller att Oracle omvandlar frågan till en sorts UNION och utvärderar båda predikaten till fullo innan resultaten kombineras.

Med det sagt, om optimeraren kan bestämma vid kompilering att ett predikat alltid kommer att utvärderas till TRUE eller FALSE , optimeraren ska bara behandla det som en konstant. Så om det till exempel finns en begränsning på tabellen som förhindrar X från att någonsin ha värdet "true", bör optimeraren inte utvärdera det andra predikatet alls (även om olika versioner av optimeraren kommer att ha olika förmåga att upptäcka att något är en konstant vid kompilering).

När det gäller den andra delen av din fråga, utan att se frågeplanerna, är det väldigt svårt att säga. Oracle-optimeraren tenderar att vara ganska bra på att omvandla frågor från en form till en annan om det finns mer effektiva sätt att utvärdera det. I allmänhet, men om subQ kommer att returnera ett relativt stort antal rader jämfört med table , kan det vara mer effektivt att strukturera frågan som en EXISTS snarare än som en IN .



  1. INSERT SELECT-sats i Oracle 11G

  2. MySQL INT betydelse

  3. Automatiskt ökande 'id'-värde när du infogar i sqlite

  4. MySQL paginering utan dubbelfråga?