همانطور که می دانید در اوراکل 11g، برای هرگونه استفاده از بسته DBMS_REDEFINITION باید مراحلی را طی نمود و انجام عملیات در یک گام امکان پذیر نمی باشد.
در اوراکل نسخه 12c، پروسیجر جدیدی به نام REDEF_TABLE به بسته DBMS_REDEFINITION اضافه شده است که از طریق ان می توان عملیاتی نظیر جابجایی انلاین و تغییر tablespace جداول و همچنین تغییر نوع فشرده سازی جداول و ایندکسها را صرفا در یک مرحله انجام داد.
برای مثال، در قسمت زیر جدول mytbl را از tbs1 به tbs2 جابجا می کنیم:
SQL> select tablespace_name from user_tables where table_name=’MYTBL’;
TABLESPACE_NAME
——————
TBS1
SQL> select index_name,status,tablespace_name from user_indexes where table_name=’MYTBL’;
INDEX_NAME STATUS TABLESPACE_NAME
—— ———- ——————–
IND1 VALID TBS1
SQL> BEGIN
2 DBMS_REDEFINITION.REDEF_TABLE(
3 uname => ‘USEF’,
4 tname => ‘MYTBL’,
5 table_part_tablespace => ‘TBS2’
6 );
7 END;
8 /
PL/SQL procedure successfully completed
SQL> select tablespace_name from user_tables where table_name=’MYTBL’;
TABLESPACE_NAME
——————————
TBS2
SQL> select index_name,status,tablespace_name from user_indexes where table_name=’MYTBL’;
INDEX_NAME STATUS TABLESPACE_NAME
—— ———- ——————–
IND1 VALID TBS1
همانطور که مشاهده می کنید، بعد از جابجایی جدول mytbl، ایندکس مربوط به این جدول کماکان در حالت valid قرار دارد و اصطلاحا unusable نشده است.
در ادامه قصد داریم با کمک روش فوق، عملیات فشرده سازی را برای جدول mytbl و ایندکس ind1 انجام دهیم.
SQL> select bytes/1024/1024 MB,segment_name from user_segments where segment_name in(‘MYTBL’,’IND1′);
MB SEGMENT_NAME
———- ————–
43 MYTBL
5 IND1
SQL> begin
2 DBMS_REDEFINITION.REDEF_TABLE (
3 uname=> ‘USEF’,
4 tname=> ‘MYTBL’,
5 table_compression_type=> ‘ROW STORE COMPRESS ADVANCED’,
6 table_part_tablespace=> ‘TBS2’,
7 index_key_compression_type=> ‘COMPRESS ADVANCED LOW’,
8 index_tablespace=> ‘TBS1’);
9 end;
10 /
PL/SQL procedure successfully completed
SQL> select bytes/1024/1024 MB,segment_name from user_segments where segment_name in(‘MYTBL’,’IND1′);
MB SEGMENT_NAME
———- ————-
40 MYTBL
3 IND1
نکته: در حین اجرای پروسیجر DBMS_REDEFINITION.REDEF_TABLE، امکان اجرای دستورات DMLای بر روی جدول امکان پذیر می باشد(توسط sessionهای دیگر) اما این پروسیجر برای خاتمه دادن به کارش نیاز دارد تا برای مدت زمان کوتاهی جدول را به صورت exclusive در اختیار بگیرد.
Comment (1)