انجام عملیات redefinition در یک مرحله با کمک پروسیجر REDEF_TABLE (اوراکل 12c)

همانطور که می دانید در اوراکل 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’,

                 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 در اختیار بگیرد.

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

Comment (1)

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد.