در زمان بازسازی یک جدول حجیم و یا درج قابل توجهی از اطلاعات در یک جدول، unusable کردن ایندکسها می تواند باعث تسریع انجام عملیات شود. در ادامه با یک مقایسه ساده، این موضوع را نشان خواهیم داد.
برای انجام سناریو، جدولی را به همراه دو ایندکس ایجاد می کنیم.
SQL>Create table usef.mytbl as select * from usef.tbl_orig where 1=2;
SQL>create index usef.ind1 on usef.mytbl(id);
SQL>create index usef.ind2 on usef.mytbl(LINE);
در صورتی که ایندکسهای جدول در حالت valid قرار داشته باشند، درج یازده میلیون رکورد، حدودا 3 دقیقه طول خواهد کشید:
SQL> conn usef/a
Connected.
SQL> set timing on
SQL> insert into usef.mytbl select * from tbl_orig;
11518080 rows created.
Elapsed: 00:03:22.52
همچنین با پرس و جوی زیر، حجم جدول را به همراه ایندکسهای آن مشاهده خواهیم کرد:
SQL>select p.owner, p.segment_name, p.BYTES / 1024 / 1024 “MB”,p.segment_type from dba_segments p where p.segment_name in (‘MYTBL’,’IND1’,’IND2’)
order by 3;
OWNER | SEGMENT_NAME | MB | SEGMENT_TYPE |
USEF | IND2 | 304 | INDEX |
USEF | IND1 | 312 | INDEX |
USEF | MYTBL | 1409 | TABLE |
حال با حذف اطلاعات جدول و unusable کردن ایندکسهای آن، این مسئله را بررسی خواهیم کرد:
SQL> truncate table usef.mytbl;
Table truncated.
SQL> alter index usef.ind1 unusable;
Index altered.
SQL> alter index usef.ind2 unusable;
Index altered.
در ادامه خواهیم دید که درج یازده میلیون رکورد به همراه بازسازی ایندکسهای جدول، حدودا 1 دقیقه زمان نیاز دارد:
SQL> startup force;
SQL> conn usef/a
Connected.
SQL> set timing on
SQL> insert into usef.mytbl select * from tbl_orig;
11518080 rows created.
Elapsed: 00:00:44.39
SQL> alter index usef.ind1 rebuild;
Index altered.
Elapsed: 00:00:19.08
SQL> alter index usef.ind2 rebuild;
Index altered.
Elapsed: 00:00:20.17
همچنین حجم جداول و ایندکسها، به صورت زیر خواهد بود:
select p.owner, p.segment_name, p.BYTES / 1024 / 1024 “MB”,p.segment_type from dba_segments p where p.segment_name in (‘MYTBL’,’IND1′,’IND2′)
order by 3;
OWNER | SEGMENT_NAME | MB | SEGMENT_TYPE |
USEF | IND2 | 192 | INDEX |
USEF | IND1 | 208 | INDEX |
USEF | MYTBL | 1415 | TABLE |