Short-Circuit Evaluation in PL/SQL
This article describes how short-circuit evaluation can be used to improve the performance of some boolean expressions.
oracle miscconfigurationintermediate
by OracleDba
33 views
This article describes how short-circuit evaluation can be used to improve the performance of some boolean expressions.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
CONN / AS SYSDBA
GRANT EXECUTE ON DBMS_LOCK TO test;
CONN test/test
CREATE OR REPLACE FUNCTION slow_function (p_number IN NUMBER)
RETURN BOOLEAN AS
BEGIN
-- Mimic a slow function.
DBMS_LOCK.sleep(0.5);
RETURN TRUE;
END;
/
SHOW ERRORS
SET SERVEROUTPUT ON
DECLARE
l_loops NUMBER := 10;
l_start NUMBER;
l_boolean BOOLEAN := TRUE;
BEGIN
-- Time normal OR.
l_start := DBMS_UTILITY.get_time;
FOR i IN 1 .. l_loops LOOP
IF slow_function(i) OR l_boolean THEN
-- Do nothing.
NULL;
END IF;
END LOOP;
DBMS_OUTPUT.put_line('Normal OR : ' ||
(DBMS_UTILITY.get_time - l_start));
-- Time short-circuit OR.
l_start := DBMS_UTILITY.get_time;
FOR i IN 1 .. l_loops LOOP
IF l_boolean OR slow_function(i) THEN
-- Do nothing.
NULL;
END IF;
END LOOP;
DBMS_OUTPUT.put_line('Short circuit OR : ' ||
(DBMS_UTILITY.get_time - l_start));
END;
/
Normal OR : 498
Short circuit OR : 0
PL/SQL procedure successfully completed.
SQL>12345678910111213141516171819202122232425262728293031323334353637383940414243
FALSE AND FALSE = FALSE
FALSE AND TRUE = FALSE
FALSE AND NULL = FALSE
SET SERVEROUTPUT ON
DECLARE
l_loops NUMBER := 10;
l_start NUMBER;
l_boolean BOOLEAN := FALSE;
BEGIN
-- Time normal AND.
l_start := DBMS_UTILITY.get_time;
FOR i IN 1 .. l_loops LOOP
IF slow_function(i) AND l_boolean THEN
-- Do nothing.
NULL;
END IF;
END LOOP;
DBMS_OUTPUT.put_line('Normal AND : ' ||
(DBMS_UTILITY.get_time - l_start));
-- Time short-circuit AND.
l_start := DBMS_UTILITY.get_time;
FOR i IN 1 .. l_loops LOOP
IF l_boolean AND slow_function(i) THEN
-- Do nothing.
NULL;
END IF;
END LOOP;
DBMS_OUTPUT.put_line('Short circuit AND: ' ||
(DBMS_UTILITY.get_time - l_start));
END;
/
Normal AND : 499
Short circuit AND: 0
PL/SQL procedure successfully completed.
SQL>Please to add comments
No comments yet. Be the first to comment!