ویژگی auto-list partitioning در اوراکل 12cR2

در اوراکل 11g، زمانی که یک جدول با متد list  پارتیشن بندی می شود، تعداد پارتیشنها ثابت خواهد بود و در صورتی که قصد درج مقداری خارج از مقادیر تعریف شده برای partition key را داشته باشیم، با خطا مواجه خواهیم شد(در صورت عدم تعریف default partition):

SQL> CREATE TABLE person( id NUMBER, name VARCHAR2(30),EYE_COLOR VARCHAR2(10) )

  2  PARTITION BY LIST (EYE_COLOR)

  3  (PARTITION p1 VALUES (‘BL’),

  4   PARTITION p2 VALUES (‘GR’)

  5  );

Table created

SQL> insert into person values(1,’hadi’,’BC’);

ORA-14400: inserted partition key does not map to any partition

این مسئله در اوراکل 12cR1 هم صادق است که یکی از راهکارهای جلوگیری از این خطا در نسخه 11g و 12cR1، تعریف پارتیشن Default می باشد که در این صورت، مقادیر تعریف نشده، در این پارتیشن قرار خواهند گرفت:

SQL> drop table person;

Table dropped

SQL> CREATE TABLE person( id NUMBER, name VARCHAR2(30),EYE_COLOR VARCHAR2(10) )

  2  PARTITION BY LIST (EYE_COLOR)

  3  (PARTITION p1 VALUES (‘BL’),

  4   PARTITION p2 VALUES (‘GR’),

  5   PARTITION p3 VALUES (default)

  6  );

Table created

SQL> insert into person values(1,’hadi’,’BC’);

1 row inserted

در اوراکل 12cR2 قابلیت auto-list partitioning در این زمینه ارائه شد که بر اساس ان با درج مقدار جدید(تعریف نشده) برای ستون partition key، بصورت خودکار، پارتیشن جدیدی به جدول اضافه خواهد شد و به صورت کلی، میتوان هر مقدار جدید را در یک پارتیشن مجزا قرار داد.

این کار با اضافه کردن کلمه AUTOMATIC بعد از عبارت Partition by list قابل انجام خواهد بود:

SQL> CREATE TABLE person( id NUMBER, name VARCHAR2(30),EYE_COLOR VARCHAR2(10) )

  2  PARTITION BY LIST (EYE_COLOR)

  3  AUTOMATIC

  4  (PARTITION p1 VALUES (‘BL’),

  5   PARTITION p2 VALUES (‘GR’)

  6  );

Table created

SQL> insert into person values(1,’hadi’,’BC’);

1 row inserted

SQL> select p.partition_name from dba_tab_partitions p where p.table_name=’PERSON’;

PARTITION_NAME

——————————————————————————–

P1

P2

SYS_P919

SQL> insert into person values(2,’reza’,’HN’);

1 row inserted

SQL> select p.partition_name from dba_tab_partitions p where p.table_name=’PERSON’;

PARTITION_NAME

——————————————————————————–

P1

P2

SYS_P919

SYS_P920

در صورتی که جدولی به صورت non-auto list پارتیشن بندی شده باشد به کمک دستور زیر، می توان پارتیشن بندی آن را بصورت auto list تغییر داد:

SQL> ALTER TABLE person SET AUTOMATIC;

Table altered

برای برگرداندن نوع پارتیشن به حالت non-auto list، باید دستور زیر را اجرا کرد:

SQL> alter table person set partitioning manual;

Table altered

البته اگر برای آن جدول، پارتیشن Default تعریف شده باشد، دستور فوق با خطا مواجه خواهد شد:

SQL> ALTER TABLE person SET AUTOMATIC;

ORA-14852: SET [SUB]PARTITIONING AUTOMATIC is not legal on this table.

در این صورت باید پارتیشن Default را حذف کرده و سپس دستور را اجرا نمود:

SQL> ALTER TABLE person DROP PARTITION (P3);

Table altered

SQL> ALTER TABLE person SET AUTOMATIC;

Table altered

برای مشاهده لیست جداولی که از قابلیت auto-list partititioning استفاده می کنند می توان به ستون autolist در ویوی user_part_tables رجوع کرد:

SQL> SELECT table_name, autolist,autolist_subpartition FROM dba_part_tables where autolist=’YES’;

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

Comment (1)

دیدگاهتان را بنویسید

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