مقدمه:
در پایگاه داده اوراکل، سریعترین راه برای دسترسی به داده های درون جداول، استفاده از آدرس قرار گیری آنها برای بلاک های ذخیره ساز های می باشد ( محل فیزیکی بر روی دیسک ها ) که به این آدرس ROWID می گویند.
در مواردی که شما باید داده ها را فرخوانی کنید، محاسباتی را انجام دهید و سپس داده ها را به روز رسانی و یا هر تغییری اعمال کنید، استفاده از ROWID در این موارد کمک می کند که کارایی بهتری داشته باشید.
نکات مهم :
- اگر عملیاتی را بتوانید بدون استفاده از SELECT و فقط با یک دستور DML انجام دهید، کارایی بهتری خواهید داشت
- ROWID برای هر رکورد، لزوما همیشه مقدار ثابتی نمی باشد و بنا به دلایلی ممکن از تغییر کند، پس برای استفاده از آنها هردفعه باید فراخوانی شوند.
پیاده سازی محیط تست :
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);
اجرای تست :
به مثال زیر دقت کنید .
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>
همانطور که مشاهده می کنید استفاده از ROWID به طور قابل ملاحظه ای سریعتر از زمانی که حتی از Primary Key استفاده می شود.