پایگاه داده اوراکل و جابجایی آنلاین partition ها و Subpartition ها

پایگاه داده اوراکل و جابجایی آنلاین partition ها و Subpartition ها

یکی از امکانات کاربردی که در پایگاه داده اوراکل وجود دارد، جابجایی جداول ( در سطح tabelspace و …) به صورت آنلاین می باشد که کاربردهای خاص خود را دارد. اما در نسخه گذشته این قابلیت برای partition ها و subpartition های جداول وجود نداشته. در اوراکل ۱۲c این امکان فراهم گردیده که در ادامه به نمونه اجرایی این فعالیت می پردازیم.
لازم به ذکر می باشد در نسخه ۱۲٫۱٫۰,۱ اگر امکان database-level supplemental logging فعال باشد نمی توان اینگونه فعالیتها را انجام داد اما در نسخه ۱۲٫۱٫۰٫۲ این محدودیت کاملا برطرف گردیده است، در ضمن فعالیت های موازی دستورات DML و direct path inserts بر روی اشیایی که در حال جابجایی آنلاین هستند، امکان پذیر نمی باشد.

جابجایی آنلاین partition :

در ادامه یک نمونه عملیاتی را باهم مشاهده می کنیم :

— Create partitioned table.
DROP TABLE t1 PURGE;

CREATE TABLE t1
(id NUMBER,
description VARCHAR2(50),
created_date DATE)
PARTITION BY RANGE (created_date)
(PARTITION part_2014 VALUES LESS THAN (TO_DATE(’01/01/2015′, ‘DD/MM/YYYY’)) TABLESPACE users,
PARTITION part_2015 VALUES LESS THAN (TO_DATE(’01/01/2016′, ‘DD/MM/YYYY’)) TABLESPACE users);

— Populate it.
INSERT INTO t1
SELECT level,
‘Description for ‘ || level,
CASE
WHEN MOD(level,2) = 0 THEN TO_DATE(’01/07/2014’, ‘DD/MM/YYYY’)
ELSE TO_DATE(’01/07/2015′, ‘DD/MM/YYYY’)
END
FROM dual
CONNECT BY level <= 1000;
COMMIT;

EXEC DBMS_STATS.gather_table_stats(USER, ‘t1’);

— Check partitions.
COLUMN table_name FORMAT A20
COLUMN partition_name FORMAT A20

SELECT table_name,
partition_name,
num_rows
FROM user_tab_partitions
ORDER BY 1,2;

TABLE_NAME PARTITION_NAME NUM_ROWS
——————– ——————– ———-
T1 PART_2014 500
T1 PART_2015 500
SQL>

حالا می توانیم یک partition را با کلمه کلیدی Online جابجا کنیم :

ALTER TABLE t1 MOVE PARTITION part_2015 ONLINE TABLESPACE users UPDATE INDEXES;
Table altered.
SQL>

جابجای آنلاین Subpartition :
در ادامه یک نمونه عملیاتی را باهم مشاهده می کنیم :

— Create sub-partitioned table.
DROP TABLE t1 PURGE;

CREATE TABLE t1
(id NUMBER,
description VARCHAR2(50),
created_date DATE)
PARTITION BY RANGE (created_date)
SUBPARTITION BY HASH (id)
SUBPARTITIONS 4
(PARTITION part_2014 VALUES LESS THAN (TO_DATE(’01/01/2015′, ‘DD/MM/YYYY’)) TABLESPACE users,
PARTITION part_2015 VALUES LESS THAN (TO_DATE(’01/01/2016′, ‘DD/MM/YYYY’)) TABLESPACE users);

— Populate it.
INSERT INTO t1
SELECT level,
‘Description for ‘ || level,
CASE
WHEN MOD(level,2) = 0 THEN TO_DATE(’01/07/2014’, ‘DD/MM/YYYY’)
ELSE TO_DATE(’01/07/2015′, ‘DD/MM/YYYY’)
END
FROM dual
CONNECT BY level <= 1000;
COMMIT;

EXEC DBMS_STATS.gather_table_stats(USER, ‘t1’, granularity => ‘SUBPARTITION’);

— Check sub-partitions.
COLUMN table_name FORMAT A20
COLUMN partition_name FORMAT A20
COLUMN subpartition_name FORMAT A20

SELECT table_name,
partition_name,
subpartition_name,
num_rows
FROM user_tab_subpartitions
ORDER BY 1,2,3;

TABLE_NAME PARTITION_NAME SUBPARTITION_NAME NUM_ROWS
——————– ——————– ——————– ———-
T1 PART_2014 SYS_SUBP786 214
T1 PART_2014 SYS_SUBP787 272
T1 PART_2014 SYS_SUBP788 242
T1 PART_2014 SYS_SUBP789 272
T1 PART_2015 SYS_SUBP790 254
T1 PART_2015 SYS_SUBP791 216
T1 PART_2015 SYS_SUBP792 280
T1 PART_2015 SYS_SUBP793 250

SQL>

حالا عملیات جابجایی را انجام می دهیم :

ALTER TABLE t1 MOVE SUBPARTITION SYS_SUBP793 ONLINE TABLESPACE users UPDATE INDEXES;
Table altered.
SQL>

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