Implicit vs. Explicit Cursors in Oracle PL/SQL
A comparison of the relative performance of implicit and explicit cursors in Oracle PL/SQL.
oracle miscconfigurationintermediate
by OracleDba
13 views
A comparison of the relative performance of implicit and explicit cursors in Oracle PL/SQL.
12345678910111213141516171819202122232425262728293031323334353637383940
SET SERVEROUTPUT ON
DECLARE
l_loops NUMBER := 100000;
l_dummy dual.dummy%TYPE;
l_start NUMBER;
CURSOR c_dual IS
SELECT dummy
FROM dual;
BEGIN
l_start := DBMS_UTILITY.get_time;
FOR i IN 1 .. l_loops LOOP
OPEN c_dual;
FETCH c_dual
INTO l_dummy;
CLOSE c_dual;
END LOOP;
DBMS_OUTPUT.put_line('Explicit: ' ||
(DBMS_UTILITY.get_time - l_start) || ' hsecs');
l_start := DBMS_UTILITY.get_time;
FOR i IN 1 .. l_loops LOOP
SELECT dummy
INTO l_dummy
FROM dual;
END LOOP;
DBMS_OUTPUT.put_line('Implicit: ' ||
(DBMS_UTILITY.get_time - l_start) || ' hsecs');
END;
/
Explicit: 273 hsecs
Implicit: 234 hsecs
PL/SQL procedure successfully completed.
SQL>1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
SET SERVEROUTPUT ON
DECLARE
l_loops NUMBER := 100000;
l_dummy dual.dummy%TYPE;
l_start NUMBER;
CURSOR c_dual IS
SELECT dummy
FROM dual;
BEGIN
l_start := DBMS_UTILITY.get_time;
FOR i IN 1 .. l_loops LOOP
OPEN c_dual;
FETCH c_dual
INTO l_dummy;
IF (c_dual%NOTFOUND) THEN
RAISE NO_DATA_FOUND;
END IF;
FETCH c_dual
INTO l_dummy;
IF (c_dual%FOUND) THEN
RAISE TOO_MANY_ROWS;
END IF;
CLOSE c_dual;
END LOOP;
DBMS_OUTPUT.put_line('Explicit: ' ||
(DBMS_UTILITY.get_time - l_start) || ' hsecs');
l_start := DBMS_UTILITY.get_time;
FOR i IN 1 .. l_loops LOOP
SELECT dummy
INTO l_dummy
FROM dual;
END LOOP;
DBMS_OUTPUT.put_line('Implicit: ' ||
(DBMS_UTILITY.get_time - l_start) || ' hsecs');
END;
/
Explicit: 402 hsecs
Implicit: 234 hsecs
PL/SQL procedure successfully completed.
SQL>123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
SET SERVEROUTPUT ON
DECLARE
l_obj all_objects%ROWTYPE;
l_start NUMBER;
CURSOR c_obj IS
SELECT *
FROM all_objects;
BEGIN
l_start := DBMS_UTILITY.get_time;
OPEN c_obj;
LOOP
FETCH c_obj
INTO l_obj;
EXIT WHEN c_obj%NOTFOUND;
-- Do something.
NULL;
END LOOP;
CLOSE c_obj;
DBMS_OUTPUT.put_line('Explicit Fetch Loop: ' ||
(DBMS_UTILITY.get_time - l_start) || ' hsecs');
l_start := DBMS_UTILITY.get_time;
FOR cur_rec IN c_obj LOOP
-- Do something.
NULL;
END LOOP;
DBMS_OUTPUT.put_line('Explicit For Loop : ' ||
(DBMS_UTILITY.get_time - l_start) || ' hsecs');
l_start := DBMS_UTILITY.get_time;
FOR cur_rec IN (SELECT * FROM all_objects) LOOP
-- Do something.
NULL;
END LOOP;
DBMS_OUTPUT.put_line('Implicit For Loop : ' ||
(DBMS_UTILITY.get_time - l_start) || ' hsecs');
END;
/
Explicit Fetch Loop: 226 hsecs
Explicit For Loop : 94 hsecs
Implicit For Loop : 93 hsecs
PL/SQL procedure successfully completed.
SQL>Please to add comments
No comments yet. Be the first to comment!