artarad_oracleuniversity

تبدیل آنلاین یک جدول اوراکل پارتیشن نشده به یک جدول پارتیشن شده در پایگاه داده اوراکل Oracle Database 12c Release 2 )12.2)

تبدیل آنلاین یک جدول اوراکل پارتیشن نشده به یک جدول اوراکل پارتیشن شده در پایگاه داده اوراکل Oracle Database 12c Release 2 )12.2)

در نسخه‌های پیشین شما می‌توانستید یک جدول بخش‌بندی نشده را با استفاده از  EXCHANGE PARTITION یا  DBMS_REDEFINITION به روش “تقریبا آنلاین” بخش‌بندی کنید اما برای هر دو روش مستلزم طی کردن چندین مرحله بودید. حالا Oracle Database 12c Release 2 این کار را ساده‌تر از هر زمانی کرده است؛ تنها به یک دستور نیاز دارد و بدون هیچ مشکلی در اجرا می‌باشد.


برای راه‌اندازی یک جدول تست بسازید. شما باید این دستور را بین هر تست تکرار کنید.

DROP TABLE t1 PURGE;

CREATE TABLE t1 (  id           NUMBER,  description  VARCHAR2(50),  created_date DATE,  CONSTRAINT t1_pk PRIMARY KEY (id));

CREATE INDEX t1_created_date_idx ON t1(created_date);

INSERT INTO t1SELECT level,       ‘Description for ‘ || level,       ADD_MONTHS(TO_DATE(’01-JAN-2017’, ‘DD-MON-YYYY’), -TRUNC(DBMS_RANDOM.value(1,4)-1)*12)FROM   dualCONNECT BY level <= 10000;COMMIT;

می‌توانیم ببینیم که دیتا بین بازه‌ی زمانی ۳ سال گسترش می‌یابد.

SELECT created_date, COUNT(*)FROM   t1GROUP BY created_dateORDER BY 1;

CREATED_D   COUNT(*)——— ———-01-JAN-15       ۳۳۴۰۰۱-JAN-16       ۳۲۹۰۰۱-JAN-17       ۳۳۷۰

SQL>

یک جدول را بخش‌بندی کنیدما می‌توانیم با دستور ALTER TABLE … MODIFY یک جدول بخش‌بندی نشده را بخش‌بندی کنیم. در ادامه چند نمونه‌ی ساده از این عملیات را می‌بینیم. اضافه کردن واژه‌ی کلیدی ONLINE  اجازه می‌دهد تا عملیات کاملا آنلاین انجام شود.

— Basic offline operation.

ALTER TABLE t1 MODIFY  PARTITION BY RANGE (created_date) (    PARTITION t1_part_2015 VALUES LESS THAN (TO_DATE(’01-JAN-2016′,’DD-MON-YYYY’)),    PARTITION t1_part_2016 VALUES LESS THAN (TO_DATE(’01-JAN-2017′,’DD-MON-YYYY’)),    PARTITION t1_part_2017 VALUES LESS THAN (TO_DATE(’01-JAN-2018′,’DD-MON-YYYY’))  );

— Online operation.

ALTER TABLE t1 MODIFY  PARTITION BY RANGE (created_date) (    PARTITION t1_part_2015 VALUES LESS THAN (TO_DATE(’01-JAN-2016′,’DD-MON-YYYY’)),    PARTITION t1_part_2016 VALUES LESS THAN (TO_DATE(’01-JAN-2017′,’DD-MON-YYYY’)),    PARTITION t1_part_2017 VALUES LESS THAN (TO_DATE(’01-JAN-2018′,’DD-MON-YYYY’))  ) ONLINE;

— Online operation with modification of index partitioning.

ALTER TABLE t1 MODIFY  PARTITION BY RANGE (created_date) (    PARTITION t1_part_2015 VALUES LESS THAN (TO_DATE(’01-JAN-2016′,’DD-MON-YYYY’)),    PARTITION t1_part_2016 VALUES LESS THAN (TO_DATE(’01-JAN-2017′,’DD-MON-YYYY’)),    PARTITION t1_part_2017 VALUES LESS THAN (TO_DATE(’01-JAN-2018′,’DD-MON-YYYY’))  ) ONLINE  UPDATE INDEXES  (    t1_pk GLOBAL,    t1_created_date_idx LOCAL  );

پس از اجرا شدن آخرین نمونه می‌توانیم شاهد بخش‌بندی‌های جدید برای جدول و همچنین فهرست بخش‌بندی شده باشیم.

COLUMN table_name FORMAT A20COLUMN partition_name FORMAT A20

SELECT table_name, partition_nameFROM   user_tab_partitionsORDER BY 1,2;

TABLE_NAME           PARTITION_NAME——————– ——————–T1                   T1_PART_2015T1                   T1_PART_2016T1                   T1_PART_2017

SQL>

COLUMN index_name FORMAT A20COLUMN partition_name FORMAT A20

SELECT index_name, partition_name, statusFROM   user_ind_partitionsORDER BY 1,2;

INDEX_NAME           PARTITION_NAME       STATUS——————– ——————– ——–T1_CREATED_DATE_IDX  T1_PART_2015         USABLET1_CREATED_DATE_IDX  T1_PART_2016         USABLET1_CREATED_DATE_IDX  T1_PART_2017         USABLE

SQL>

بخش‌بندی جایگزین کردن یک جدول  Composite Partition (Sub-Partition)جدول اصلی همچنین می‌تواند با دستور ALTER TABLE … MODIFY بخش‌بندی مرکب (Composite) شود. در نمونه‌ی پایین ما یک جدول اصلی را به یک جدول بخش‌بندی شده‌ی range-hash تبدیل کردیم.

ALTER TABLE t1 MODIFY  PARTITION BY RANGE (created_date) SUBPARTITION BY HASH (id)(    PARTITION t1_part_2015 VALUES LESS THAN (TO_DATE(’01-JAN-2016′,’DD-MON-YYYY’)) (      SUBPARTITION t1_sub_part_2015_1,      SUBPARTITION t1_sub_part_2015_2,      SUBPARTITION t1_sub_part_2015_3,      SUBPARTITION t1_sub_part_2015_4    ),    PARTITION t1_part_2016 VALUES LESS THAN (TO_DATE(’01-JAN-2017′,’DD-MON-YYYY’)) (      SUBPARTITION t1_sub_part_2016_1,      SUBPARTITION t1_sub_part_2016_2,      SUBPARTITION t1_sub_part_2016_3,      SUBPARTITION t1_sub_part_2016_4    ),    PARTITION t1_part_2017 VALUES LESS THAN (TO_DATE(’01-JAN-2018′,’DD-MON-YYYY’)) (      SUBPARTITION t1_sub_part_2017_1,      SUBPARTITION t1_sub_part_2017_2,      SUBPARTITION t1_sub_part_2017_3,      SUBPARTITION t1_sub_part_2017_4    )  ) ONLINE  UPDATE INDEXES  (    t1_pk GLOBAL,    t1_created_date_idx LOCAL  );

بخش‌بندی‌های جایگزین (sub-partitions) و فهرست بخش‌بندی شده (partitioned index) با استفاده از کوئری زیر نمایش داده می‌شوند.

COLUMN table_name FORMAT A20COLUMN partition_name FORMAT A20COLUMN subpartition_name FORMAT A20

SELECT table_name, partition_name, subpartition_nameFROM   user_tab_subpartitionsORDER BY 1,2, 3;

TABLE_NAME           PARTITION_NAME       SUBPARTITION_NAME——————– ——————– ——————–T1                   T1_PART_2015         T1_SUB_PART_2015_1T1                   T1_PART_2015         T1_SUB_PART_2015_2T1                   T1_PART_2015         T1_SUB_PART_2015_3T1                   T1_PART_2015         T1_SUB_PART_2015_4T1                   T1_PART_2016         T1_SUB_PART_2016_1T1                   T1_PART_2016         T1_SUB_PART_2016_2T1                   T1_PART_2016         T1_SUB_PART_2016_3T1                   T1_PART_2016         T1_SUB_PART_2016_4T1                   T1_PART_2017         T1_SUB_PART_2017_1T1                   T1_PART_2017         T1_SUB_PART_2017_2T1                   T1_PART_2017         T1_SUB_PART_2017_3T1                   T1_PART_2017         T1_SUB_PART_2017_4

SQL>

COLUMN index_name FORMAT A20COLUMN partition_name FORMAT A20COLUMN subpartition_name FORMAT A20

SELECT index_name, partition_name, subpartition_name, statusFROM   user_ind_subpartitionsORDER BY 1,2;

INDEX_NAME           PARTITION_NAME       SUBPARTITION_NAME    STATUS——————– ——————– ——————– ——–T1_CREATED_DATE_IDX  T1_PART_2015         T1_SUB_PART_2015_1   USABLET1_CREATED_DATE_IDX  T1_PART_2015         T1_SUB_PART_2015_2   USABLET1_CREATED_DATE_IDX  T1_PART_2015         T1_SUB_PART_2015_3   USABLET1_CREATED_DATE_IDX  T1_PART_2015         T1_SUB_PART_2015_4   USABLET1_CREATED_DATE_IDX  T1_PART_2016         T1_SUB_PART_2016_1   USABLET1_CREATED_DATE_IDX  T1_PART_2016         T1_SUB_PART_2016_2   USABLET1_CREATED_DATE_IDX  T1_PART_2016         T1_SUB_PART_2016_4   USABLET1_CREATED_DATE_IDX  T1_PART_2016         T1_SUB_PART_2016_3   USABLET1_CREATED_DATE_IDX  T1_PART_2017         T1_SUB_PART_2017_1   USABLET1_CREATED_DATE_IDX  T1_PART_2017         T1_SUB_PART_2017_3   USABLET1_CREATED_DATE_IDX  T1_PART_2017         T1_SUB_PART_2017_2   USABLET1_CREATED_DATE_IDX  T1_PART_2017         T1_SUB_PART_2017_4   USABLE

SQL>

محدودیت‌هادر استفاده از این روش یک‌سری محدودیت‌ها وجود دارد.
• نمی‌توانید یک جدول  index-organized table) IOT) را با استفاده از این روش بخش‌بندی کنید.

• اگر جدول دارای  domain indexباشد، این روش قابل استفاده نیست.

• در حالت آفلاین می‌توانید تنها یک جدول را به جدول reference-partitioned child table تبدیل کنید.

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *