ROWIDs for PL/SQL Performance
This article demonstrates how using ROWIDs in transactions can improve performance.
oracle miscconfigurationintermediate
by OracleDba
11 views
This article demonstrates how using ROWIDs in transactions can improve performance.
12345678910
CREATE TABLE rowid_test AS
SELECT *
FROM all_objects;
ALTER TABLE rowid_test ADD (
CONSTRAINT rowid_test_pk
PRIMARY KEY (object_id)
);
EXEC DBMS_STATS.gather_table_stats(USER, 'rowid_test', cascade => TRUE);1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
SET SERVEROUTPUT ON
DECLARE
TYPE t_id_tab IS TABLE OF rowid_test.object_id%TYPE;
l_id_tab t_id_tab;
l_rowid ROWID;
l_start NUMBER;
BEGIN
SELECT object_id
BULK COLLECT INTO l_id_tab
FROM rowid_test;
l_start := DBMS_UTILITY.get_time;
FOR i IN l_id_tab.first .. l_id_tab.last LOOP
SELECT rowid
INTO l_rowid
FROM rowid_test
WHERE object_id = l_id_tab(i)
FOR UPDATE;
UPDATE rowid_test
SET object_name = object_name
WHERE object_id = l_id_tab(i);
END LOOP;
DBMS_OUTPUT.put_line('Primary Key (' || l_id_tab.count || ' rows): ' ||
(DBMS_UTILITY.get_time - l_start) || ' hsecs');
l_start := DBMS_UTILITY.get_time;
FOR i IN l_id_tab.first .. l_id_tab.last LOOP
SELECT rowid
INTO l_rowid
FROM rowid_test
WHERE object_id = l_id_tab(i)
FOR UPDATE;
UPDATE rowid_test
SET object_name = object_name
WHERE rowid = l_rowid;
END LOOP;
DBMS_OUTPUT.put_line('Rowid (' || l_id_tab.count || ' rows) : ' ||
(DBMS_UTILITY.get_time - l_start) || ' hsecs');
END;
/
Primary Key (72699 rows): 501 hsecs
Rowid (72699 rows) : 448 hsecs
PL/SQL procedure successfully completed.
SQL>1
DROP TABLE rowid_test PURGE;Please to add comments
No comments yet. Be the first to comment!