artarad-Database-12c

آنلاین SPLIT PARTITION و SPLIT SUBPARTITION در پایگاه داده۱۲٫۲C

۱ مقدمه
در اوراکل ۱۲٫۲c عملیات SPLIT PARTITION و SPLIT SUBPARTITIONمی تواند بصورت آنلاین برروی جداول انجام شود بدون آنکه عملیات DML را مسدود کند. این کار با اضافه کردن کلمه ONLINE انجام می شود و همین امر باعث می شود بدون نیاز به مشخص کردن عبارت UPDATE INDEXES ، ایندکس ها محلی و گلوبال را آپدیت کند.

آنلاین SPLIT PARTITION و SPLIT SUBPARTITION در پایگاه داده۱۲٫۲C

۲ SPLIT PARTITION آنلاین
ایجاد یک جدول پارتیشن شده با یک پارتیشن ، همراه با یک ایندکس پارتیشن شده و گلبال.

DROP TABLE t1 PURGE;

CREATE TABLE t1 (

id NUMBER,

code VARCHAR2(10),

description VARCHAR2(50),

created_date DATE,

CONSTRAINT t1_pk PRIMARY KEY (id)

)

PARTITION BY RANGE (created_date)

(

PARTITION t1_2017 VALUES LESS THAN (MAXVALUE)

);

CREATE INDEX t1_created_date_idx ON t1 (created_date) LOCAL;

CREATE INDEX t1_code_idx ON t1 (code);

INSERT INTO t1 VALUES ( 1, ‘ONE’, ‘Description for ONE’, TO_DATE(’01-JUL-2015′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES ( 2, ‘TWO’, ‘Description for ONE’, TO_DATE(’01-JUL-2015′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES ( 3, ‘THREE’, ‘Description for ONE’, TO_DATE(’01-JUL-2015′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES ( 4, ‘FOUR’, ‘Description for ONE’, TO_DATE(’01-JUL-2015′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES ( 5, ‘ONE’, ‘Description for ONE’, TO_DATE(’01-JUL-2016′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES ( 6, ‘TWO’, ‘Description for ONE’, TO_DATE(’01-JUL-2016′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES ( 7, ‘THREE’, ‘Description for ONE’, TO_DATE(’01-JUL-2016′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES ( 8, ‘FOUR’, ‘Description for ONE’, TO_DATE(’01-JUL-2016′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES ( 9, ‘ONE’, ‘Description for ONE’, TO_DATE(’01-JUL-2017′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES (10, ‘TWO’, ‘Description for ONE’, TO_DATE(’01-JUL-2017′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES (11, ‘THREE’, ‘Description for ONE’, TO_DATE(’01-JUL-2017′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES (12, ‘FOUR’, ‘Description for ONE’, TO_DATE(’01-JUL-2017′,’DD-MON-YYYY’));

COMMIT;

EXEC DBMS_STATS.gather_table_stats(USER, ‘t1’, cascade => TRUE);

نمایش اطلاعات ایندکس و پارتیشن جدول فعلی.

— Table partitions.

COLUMN table_name FORMAT A30

COLUMN partition_name FORMAT A30

SELECT table_name,

partition_name,

num_rows

FROM user_tab_partitions

ORDER BY 1, 2;

TABLE_NAME PARTITION_NAME NUM_ROWS

—————————— —————————— ———-

T1 T1_2017 12

SQL>

— Indexes.

COLUMN index_name FORMAT A30

COLUMN partitioned FORMAT A11

SELECT index_name,

partitioned,

status

FROM user_indexes

ORDER BY 1;

INDEX_NAME PARTITIONED STATUS

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

T1_CODE_IDX NO VALID

T1_CREATED_DATE_IDX YES N/A

T1_PK NO VALID

SQL>

— Index partitions.

SELECT index_name,

partition_name,

status

FROM user_ind_partitions

ORDER BY 1, 2;

INDEX_NAME PARTITION_NAME STATUS

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

T1_CREATED_DATE_IDX T1_2017 USABLE

SQL>

انجام عملیات آنلاین تقسیم پارتیشن ۲۰۱۷ به ایجاد پارتیشن جدید برای ردیف های با مقدار ستون CREATED_DATE که برابر با ۲۰۱۵ هستند.

ALTER TABLE t1

SPLIT PARTITION t1_2017 AT (TO_DATE(’31-DEC-2015 23:59:59′, ‘DD-MON-YYYY HH24:MI:SS’))

INTO (PARTITION t1_2015,

PARTITION t1_2017)

ONLINE;

EXEC DBMS_STATS.gather_table_stats(USER, ‘t1’, cascade => TRUE);

نمایش وضعیت فعلی ایندکس ها و پارتیشن های جدول. توجه کنید ایندکس های محلی و گلوبال بدون آن که عبارت UPDATE INDEXES مشخص کنید درحالت قابل استفاده باقی مانده اند.

— Table partitions.

COLUMN table_name FORMAT A30

COLUMN partition_name FORMAT A30

SELECT table_name,

partition_name,

num_rows

FROM user_tab_partitions

ORDER BY 1, 2;

TABLE_NAME PARTITION_NAME NUM_ROWS

—————————— —————————— ———-

T1 T1_2015 4

T1 T1_2017 8

SQL>

— Indexes.

COLUMN index_name FORMAT A30

COLUMN partitioned FORMAT A11

SELECT index_name,

partitioned,

status

FROM user_indexes

ORDER BY 1;

INDEX_NAME PARTITIONED STATUS

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

T1_CODE_IDX NO VALID

T1_CREATED_DATE_IDX YES N/A

T1_PK NO VALID

SQL>

— Index partitions.

SELECT index_name,

partition_name,

status

FROM user_ind_partitions

ORDER BY 1, 2;

INDEX_NAME PARTITION_NAME STATUS

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

T1_CREATED_DATE_IDX T1_2015 USABLE

T1_CREATED_DATE_IDX T1_2017 USABLE

SQL>

برای یک مقایسه، انجام یک عملیات آفلاین برای تقسیم پارتیشن ۲۰۱۷ برای ایجاد پارتیشن جدید برای ردیف های با مقدار ستون CREATED_DATE که برابر با ۲۰۱۶ هستند.

ALTER TABLE t1

SPLIT PARTITION t1_2017 AT (TO_DATE(’31-DEC-2016 23:59:59′, ‘DD-MON-YYYY HH24:MI:SS’))

INTO (PARTITION t1_2016,

PARTITION t1_2017);

EXEC DBMS_STATS.gather_table_stats(USER, ‘t1’, cascade => TRUE);

نمایش وضعیت فعلی ایندکس ها و پارتیشن های جدول. توجه کنید هردو ایندکس های محلی و گلوبال روی پارتیشن های تغییر یافته درحالت غیرقابل استفاده قرار دارند زیرا عبارت UPDATE INDEXES یا کلمه کلیدی ONLINE مشخص شده است.

— Table partitions.

COLUMN table_name FORMAT A30

COLUMN partition_name FORMAT A30

SELECT table_name,

partition_name,

num_rows

FROM user_tab_partitions

ORDER BY 1, 2;

TABLE_NAME PARTITION_NAME NUM_ROWS

—————————— —————————— ———-

T1 T1_2015 4

T1 T1_2016 4

T1 T1_2017 4

SQL>

— Indexes.

COLUMN index_name FORMAT A30

COLUMN partitioned FORMAT A11

SELECT index_name,

partitioned,

status

FROM user_indexes

ORDER BY 1;

INDEX_NAME PARTITIONED STATUS

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

T1_CODE_IDX NO UNUSABLE

T1_CREATED_DATE_IDX YES N/A

T1_PK NO UNUSABLE

SQL>

— Index partitions.

COLUMN partition_name FORMAT A30

SELECT index_name,

partition_name,

status

FROM user_ind_partitions

ORDER BY 1, 2;

INDEX_NAME PARTITION_NAME STATUS

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

T1_CREATED_DATE_IDX T1_2015 USABLE

T1_CREATED_DATE_IDX T1_2016 UNUSABLE

T1_CREATED_DATE_IDX T1_2017 UNUSABLE

SQL>

۳ SPLIT SUBPARTITION آنلاین
ایجاد یک زیرپارتیشن برای جدول، با دو پارتیشن که هرکدام با دو زیرپارتیشن، به همراه ایندکس پارتیشن شده و گلوبال.

$ DROP TABLE t1 PURGE;

CREATE TABLE t1 (

id NUMBER,

code VARCHAR2(10),

description VARCHAR2(50),

created_date DATE,

CONSTRAINT t1_pk PRIMARY KEY (id)

)

PARTITION BY RANGE (created_date)

SUBPARTITION BY LIST (code)

SUBPARTITION TEMPLATE (

SUBPARTITION small VALUES (‘ONE’, ‘TWO’, ‘THREE’),

SUBPARTITION others VALUES (DEFAULT)

)

(

PARTITION year_2016 VALUES LESS THAN ( TO_DATE(’01-JAN-2017′,’DD-MON-YYYY’)),

PARTITION year_2017 VALUES LESS THAN ( TO_DATE(’01-JAN-2018′,’DD-MON-YYYY’))

);

CREATE INDEX t1_created_date_idx ON t1 (created_date) LOCAL;

CREATE INDEX t1_code_idx ON t1 (code);

INSERT INTO t1 VALUES (1, ‘ONE’, ‘Description for ONE’, TO_DATE(’01-JUL-2016′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES (2, ‘TWO’, ‘Description for ONE’, TO_DATE(’01-JUL-2016′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES (3, ‘THREE’, ‘Description for ONE’, TO_DATE(’01-JUL-2016′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES (4, ‘FOUR’, ‘Description for ONE’, TO_DATE(’01-JUL-2016′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES (5, ‘ONE’, ‘Description for ONE’, TO_DATE(’01-JUL-2017′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES (6, ‘TWO’, ‘Description for ONE’, TO_DATE(’01-JUL-2017′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES (7, ‘THREE’, ‘Description for ONE’, TO_DATE(’01-JUL-2017′,’DD-MON-YYYY’));

INSERT INTO t1 VALUES (8, ‘FOUR’, ‘Description for ONE’, TO_DATE(’01-JUL-2017′,’DD-MON-YYYY’));

COMMIT;

EXEC DBMS_STATS.gather_table_stats(USER, ‘T1’, cascade => TRUE);

نمایش اطلاعات پارتیشن و ایندکس جدول فعلی.

SET LINESIZE 120

— Table subpartitions.

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 YEAR_2016 YEAR_2016_OTHERS 1

T1 YEAR_2016 YEAR_2016_SMALL 3

T1 YEAR_2017 YEAR_2017_OTHERS 1

T1 YEAR_2017 YEAR_2017_SMALL 3

SQL>

— Indexes.

SELECT index_name,

partitioned,

status

FROM user_indexes

ORDER BY 1;

INDEX_NAME PARTITIONED STATUS

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

T1_CODE_IDX NO VALID

T1_CREATED_DATE_IDX YES N/A

T1_PK NO VALID

SQL>

— Index subpartitions.

SELECT index_name,

partition_name,

subpartition_name,

status

FROM user_ind_subpartitions

ORDER BY 1,2,3;

INDEX_NAME PARTITION_NAME SUBPARTITION_NAME STATUS

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

T1_CREATED_DATE_IDX YEAR_2016 YEAR_2016_OTHERS USABLE

T1_CREATED_DATE_IDX YEAR_2016 YEAR_2016_SMALL USABLE

T1_CREATED_DATE_IDX YEAR_2017 YEAR_2017_OTHERS USABLE

T1_CREATED_DATE_IDX YEAR_2017 YEAR_2017_SMALL USABLE

SQL>

انجام یک عملیات آنلاین برای تقسیم زیرپارتیشن “small” برای ایجاد یک پارتیشن جدید برای ردیف هایی با مقدار ستون CODE برابر ‘TWO’ و ‘THREE’می باشد.

ALTER TABLE t1 SPLIT SUBPARTITION year_2016_small

VALUES (‘TWO’, ‘THREE’) INTO (

SUBPARTITION year_2016_two_three,

SUBPARTITION year_2016_small

)

ONLINE;

EXEC DBMS_STATS.gather_table_stats(USER, ‘T1’, cascade => TRUE);

نمایش وضعیت فعلی ایندکس ها و زیرپارتیشن های جدول. توجه داشته باشید هردو ایندکس محلی و گلوبال بدون مشخص کردن عبارت UPDATE INDEXES در وضعیت قابل استفاده می باشد.

— Table subpartitions.

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 YEAR_2016 YEAR_2016_OTHERS 1

T1 YEAR_2016 YEAR_2016_SMALL 1

T1 YEAR_2016 YEAR_2016_TWO_THREE 2

T1 YEAR_2017 YEAR_2017_OTHERS 1

T1 YEAR_2017 YEAR_2017_SMALL 3

SQL>

— Indexes.

SELECT index_name,

partitioned,

status

FROM user_indexes

ORDER BY 1;

INDEX_NAME PARTITIONED STATUS

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

T1_CODE_IDX NO VALID

T1_CREATED_DATE_IDX YES N/A

T1_PK NO VALID

SQL>

— Index subpartitions.

SELECT index_name,

partition_name,

subpartition_name,

status

FROM user_ind_subpartitions

ORDER BY 1,2,3;

INDEX_NAME PARTITION_NAME SUBPARTITION_NAME STATUS

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

T1_CREATED_DATE_IDX YEAR_2016 YEAR_2016_OTHERS USABLE

T1_CREATED_DATE_IDX YEAR_2016 YEAR_2016_SMALL USABLE

T1_CREATED_DATE_IDX YEAR_2016 YEAR_2016_TWO_THREE USABLE

T1_CREATED_DATE_IDX YEAR_2017 YEAR_2017_OTHERS USABLE

T1_CREATED_DATE_IDX YEAR_2017 YEAR_2017_SMALL USABLE

SQL>

برای یک مقایسه، انجام یک عملیات آفلاین برای تقسیم زیرپارتیشن برای پارتیشن دوم.

ALTER TABLE t1 SPLIT SUBPARTITION year_2017_small

VALUES (‘TWO’, ‘THREE’) INTO (

SUBPARTITION year_2017_two_three,

SUBPARTITION year_2017_small

);

EXEC DBMS_STATS.gather_table_stats(USER, ‘T1’, cascade => TRUE);

نمایش وضعیت فعلی ایندکس ها و زیرپارتیشن های جدول توجه کنید هردو ایندکس های محلی و گلوبال، روی زیرپارتیشن های تغییریافته دروضعیت غیرقابل استفاده می باشد زیرا با عبارت UPDATE INDEXES یا کلمه کلیدی ONLINE مشخص نشده است.

— Table subpartitions.

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 YEAR_2016 YEAR_2016_OTHERS 1

T1 YEAR_2016 YEAR_2016_SMALL 1

T1 YEAR_2016 YEAR_2016_TWO_THREE 2

T1 YEAR_2017 YEAR_2017_OTHERS 1

T1 YEAR_2017 YEAR_2017_SMALL 1

T1 YEAR_2017 YEAR_2017_TWO_THREE 2

SQL>

— Indexes.

SELECT index_name,

partitioned,

status

FROM user_indexes

ORDER BY 1;

INDEX_NAME PARTITIONED STATUS

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

T1_CODE_IDX NO UNUSABLE

T1_CREATED_DATE_IDX YES N/A

T1_PK NO UNUSABLE

SQL>

— Index subpartitions.

SELECT index_name,

partition_name,

subpartition_name,

status

FROM user_ind_subpartitions

ORDER BY 1,2,3;

INDEX_NAME PARTITION_NAME SUBPARTITION_NAME STATUS

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

T1_CREATED_DATE_IDX YEAR_2016 YEAR_2016_OTHERS USABLE

T1_CREATED_DATE_IDX YEAR_2016 YEAR_2016_SMALL USABLE

T1_CREATED_DATE_IDX YEAR_2016 YEAR_2016_TWO_THREE USABLE

T1_CREATED_DATE_IDX YEAR_2017 YEAR_2017_OTHERS USABLE

T1_CREATED_DATE_IDX YEAR_2017 YEAR_2017_SMALL UNUSABLE

T1_CREATED_DATE_IDX YEAR_2017 YEAR_2017_TWO_THREE UNUSABLE

SQL>

0 پاسخ

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

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

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

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