دیتابیس اوراکل

دیتابیس اوراکل
طبقه بندی موضوعی

۵ مطلب با موضوع «Partitioning» ثبت شده است

select زدن از یک partition یا subpartition خاص در یک جدول بر اساس نام

select table_name, partition_name
  from user_tab_partitions 
 where table_name='TAB_PART_COMPOSITE_INTERVAL';

TABLE_NAME PARTITION_NAME
TAB_PART_COMPOSITE_INTERVAL TAB_PART_COMPOSITE_INTERVAL_P1
TAB_PART_COMPOSITE_INTERVAL SYS_P14036

 

 

 

 

select * from TAB_PART_COMPOSITE_INTERVAL partition(SYS_P14036);

 

 

select table_name, partition_name, subpartition_name
  from user_tab_subpartitions 
 where table_name='TAB_PART_COMPOSITE_INTERVAL'
   and partition_name='SYS_P14036';

TABLE_NAME PARTITION_NAME SUBPARTITION_NAME
TAB_PART_COMPOSITE_INTERVAL SYS_P14036 SYS_SUBP14005
TAB_PART_COMPOSITE_INTERVAL SYS_P14036 SYS_SUBP14006

 

 

 

 

select * from TAB_PART_COMPOSITE_INTERVAL subpartition(SYS_SUBP14028);

 

Partition by MONTH & Subpartition by DAY

برای پارتیشن کردن یک جدول به این صورت که پارتیشن بندی اصلی آن به صورت ماهانه و subpartition آن به صورت روزانه باشد، باید یک Virtual Column به جدول اضافه شود تا بتوان subpartition بر اساس روز را بر اساس آن انجام داد.

 

CREATE TABLE TAB_PART_COMPOSITE_INTERVAL
(
  ID NUMBER(19,0), 
  TDATE TIMESTAMP (6) DEFAULT SYSTIMESTAMP, 
  TDAY NUMBER(2,0) GENERATED ALWAYS AS (EXTRACT(DAY FROM TDATE)) VIRTUAL
)
PARTITION BY RANGE (TDATE) INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
   SUBPARTITION BY LIST (TDAY)
   SUBPARTITION TEMPLATE
(
  SUBPARTITION P01 VALUES (1),
  SUBPARTITION P02 VALUES (2),
  SUBPARTITION P03 VALUES (3),
  SUBPARTITION P04 VALUES (4),
  SUBPARTITION P05 VALUES (5),
  SUBPARTITION P06 VALUES (6),
  SUBPARTITION P07 VALUES (7),
  SUBPARTITION P08 VALUES (8),
  SUBPARTITION P09 VALUES (9),
  SUBPARTITION P10 VALUES (10),
  SUBPARTITION P11 VALUES (11),
  SUBPARTITION P12 VALUES (12),
  SUBPARTITION P13 VALUES (13),
  SUBPARTITION P14 VALUES (14),
  SUBPARTITION P15 VALUES (15),
  SUBPARTITION P16 VALUES (16),
  SUBPARTITION P17 VALUES (17),
  SUBPARTITION P18 VALUES (18),
  SUBPARTITION P19 VALUES (19),
  SUBPARTITION P20 VALUES (20),
  SUBPARTITION P21 VALUES (21),
  SUBPARTITION P22 VALUES (22),
  SUBPARTITION P23 VALUES (23),
  SUBPARTITION P24 VALUES (24),
  SUBPARTITION P25 VALUES (25),
  SUBPARTITION P26 VALUES (26),
  SUBPARTITION P27 VALUES (27),
  SUBPARTITION P28 VALUES (28),
  SUBPARTITION P29 VALUES (29),
  SUBPARTITION P30 VALUES (30),
  SUBPARTITION P31 VALUES (31)
)
(  
  PARTITION TAB_PART_COMPOSITE_INTERVAL_P1

  VALUES LESS THAN (TO_DATE('2019-12-24','YYYY-MM-DD'))
);

 

بعد از پارتیشن کردن جدول ، یکی از روشهای کوئری زدن به صورتی که بتوان از این نوع پارتیشن استفاده کرد به صورت زیر است :

SELECT * 
  FROM TAB_PART_COMPOSITE_INTERVAL 
WHERE TO_CHAR(TDATE, 'YYYY-MM')='2019-12' 
    AND TDAY = 24;

مثال از Interval-List Partitioning

alter table A.TEST modify

partition by range (TIME1) interval(numtodsinterval(1, 'DAY')) 

subpartition by list (SERIAL1)

   subpartition template

   ( subpartition SERIAL_P1 values (110)

   , subpartition SERIAL_P2 values (111)

   , subpartition SERIAL_P3 values (112)

   , subpartition SERIAL_P4 values (113)

   )

(  

   partition TEST_P1 values less than (to_date('19-03-2019', 'DD-MM-YYYY'))  

) online update indexes parallel;

online move lob partition

SQL> alter table TEST.MESSAGE move partition MESG01 online lob (content) store as (tablespace TEST_TBS) update indexes ;

پاک کردن N پارتیشن آخر یک جدول به صورت دوره ای

 

یک سری جداول وجود دارند که لازم است پارتیشن های آنها به صورت دوره ای پاک شوند. مثلا یک policy میگذاریم که 10 پارتیشن آخر یک جدول نگه داشته شوند و بقیه drop شود. با استفاده از مراحل زیر میتوان این کار را انجام داد:

 

1- یک جدول بنام list_drop_part ایجاد میکنیم و لیست جداولی که قرار است پارتیشن های آنها drop شود و همچنین policy که برای drop شدن پارتیشن ها وجود دارد را به آن جدول اضافه میکنیم.

create table c##usr1.list_drop_part

( tab_own  varchar2(128 byte),

 tab_name varchar2(128 byte),

 interval number) ;

 

 

برای هر جدول جدید، اگر لازم است پارتیشن های آن drop شود باید نام آن به list_drop_part اضافه شود. 

- در ستون interval تعداد پارتیشنهایی که باید نگهداری شوند را مشخص میکنیم.

 

2- یک جدول با نام result_drop_part ایجاد میکنیم که اطلاعات پارتیشن های drop شده در آن ریخته میشود.

 

create table c##usr1.result_drop_part

( tab_own    varchar2(128 byte),

  tab_name   varchar2(128 byte),

  part_name  varchar2(128 byte),

  high_value date,

  exec_date  date);

 

 

3- با استفاده از پروسیجر زیر میتوانیم پارتیشن های جداولی را که به list_drop_part اضافه شده اند ، بر اساس policyهای معین شده حذف نماییم.

 drop_partition_prc

 

نکته2) برای اجرای پکیج بالا باید grantهای زیر به کاربر c##usr1 داده شود.

 

grant drop any table to c##usr1 container=all;

grant select on dba_tab_partitions to c##usr1 container=all;

 

    4- میتوانیم یک job ایجاد کنیم که به صورت دوره ای اجرا شود و پروسیجر بالا را فراخوانی کند.