مقدمه:

در پایگاه داده اوراکل، سریعترین راه برای دسترسی به داده های درون جداول، استفاده از آدرس قرار گیری آنها برای بلاک های ذخیره ساز های می باشد ( محل فیزیکی بر روی دیسک ها ) که به این آدرس 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 استفاده می شود.