sql >> Database >  >> RDS >> Oracle

Gebruikt Oracle kortsluitevaluatie?

Het hangt ervan af.. In het algemeen kan Oracle niet garanderen dat een SQL-statement gebruik maakt van kortsluitingsevaluatie (hoewel PL/SQL gegarandeerd een kortsluitevaluatie uitvoert). De Oracle-optimizer is vrij om de predikaten te evalueren in elke volgorde die hij verwacht het meest efficiënt te zijn. Dat kan betekenen dat het eerste predikaat als eerste wordt geëvalueerd en dat alleen de overeenkomende rijen het tweede predikaat hebben, maar het is heel goed mogelijk dat ofwel het omgekeerde gebeurt of dat Oracle de query transformeert in een soort UNION en evalueert beide predikaten volledig voordat de resultaten worden gecombineerd.

Dat gezegd hebbende, als de optimizer tijdens het compileren kan bepalen dat een predikaat altijd zal evalueren naar TRUE of FALSE , zou de optimizer dat gewoon als een constante moeten beschouwen. Dus als er bijvoorbeeld een beperking op de tabel is die voorkomt dat X van ooit de waarde 'true' te hebben, zou de optimizer het tweede predikaat helemaal niet moeten evalueren (hoewel verschillende versies van de optimizer verschillende mogelijkheden hebben om te detecteren dat iets constant is tijdens het compileren).

Wat betreft het tweede deel van uw vraag, zonder de queryplannen te zien, is het erg moeilijk te zeggen. De Oracle-optimizer is meestal redelijk goed in het transformeren van query's van de ene vorm naar de andere als er efficiëntere manieren zijn om deze te evalueren. In het algemeen geldt echter dat als subQ gaat een relatief groot aantal rijen retourneren in vergelijking met table , kan het efficiënter zijn om de zoekopdracht te structureren als een EXISTS in plaats van als een IN .



  1. Hibernate en SQL Server goed laten spelen met VARCHAR en NVARCHAR

  2. REGEX om de n-de waarde uit een lijst te selecteren, waarbij nulls worden toegestaan

  3. PostgreSQL verwijder alle inhoud

  4. MySQL Selecteer datum gelijk aan vandaag