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