تبدیل آنلاین یک جدول اوراکل پارتیشن نشده به یک جدول پارتیشن شده در پایگاه داده اوراکل 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 تبدیل کنید.
دیدگاه خود را ثبت کنید
تمایل دارید در گفتگوها شرکت کنید؟در گفتگو ها شرکت کنید.