oracle 11g 分割槽表建立(年月日周時分秒)

luleipo發表於2021-01-02

oracle 11g 支援自動分割槽,不過得在建立表時就設定好分割槽。

如果已經存在的表需要改分割槽表,就需要將當前表 rename後,再建立新表,然後複製資料到新表,然後刪除舊錶就可以了。

一、為什麼要分割槽

原因很簡單,

二、如何分割槽

2.1 按年分割槽

numtoyminterval(1, 'year') 

--按年建立分割槽表
create table test_part
(
   ID NUMBER(20) not null,
   REMARK VARCHAR2(1000),
   create_time DATE
)
PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, 'year'))
(partition part_t01 values less than(to_date('2018-11-01', 'yyyy-mm-dd')));

--建立主鍵
alter table test_part add constraint test_part_pk primary key (ID) using INDEX;
-- Create/Recreate indexes 
create index test_part_create_time on TEST_PART (create_time);

2.2按月分割槽

numtoyminterval(1, 'month')

--按月建立分割槽表
create table test_part
(
   ID NUMBER(20) not null,
   REMARK VARCHAR2(1000),
   create_time DATE
)
PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, 'month'))
(partition part_t01 values less than(to_date('2018-11-01', 'yyyy-mm-dd')));

--建立主鍵
alter table test_part add constraint test_part_pk primary key (ID) using INDEX;

2.3按天分割槽

NUMTODSINTERVAL(1, 'day')

--按天建立分割槽表
create table test_part
(
   ID NUMBER(20) not null,
   REMARK VARCHAR2(1000),
   create_time DATE
)
PARTITION BY RANGE (CREATE_TIME) INTERVAL (NUMTODSINTERVAL(1, 'day'))
(partition part_t01 values less than(to_date('2018-11-12', 'yyyy-mm-dd')));

--建立主鍵
alter table test_part add constraint test_part_pk primary key (ID) using INDEX;

2.4測試

可以新增幾條資料來看看效果,oracle 會自動新增分割槽。

--查詢當前表有多少分割槽
select table_name,partition_name from user_tab_partitions where table_name='TEST_PART';

--查詢這個表的某個(SYS_P21)裡的資料
select * from TEST_PART partition(SYS_P21);

三、numtoyminterval 和 numtodsinterval 的區別

3.1 numtodsinterval(<x>,<c>) ,x 是一個數字,c 是一個字串。

把 x 轉為 interval day to second 資料型別。

常用的單位有 ('day','hour','minute','second')。

測試一下:

 select sysdate, sysdate + numtodsinterval(4,'hour') as res from dual;

結果:

3.2 numtoyminterval (<x>,<c>)

將 x 轉為 interval year to month 資料型別。

常用的單位有 ('year','month')。

測試一下:

select sysdate, sysdate + numtoyminterval(3, 'year') as res from dual;

結果:

四、給已有的表分割槽

需要先備份表,然後新建這個表,拷貝資料,刪除備份表。

-- 1. 重新命名
alter table test_part rename to test_part_temp;

-- 2. 建立 partition table
create table test_part
(
   ID NUMBER(20) not null,
   REMARK VARCHAR2(1000),
   create_time DATE
)
PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, 'month'))
(partition part_t1 values less than(to_date('2018-11-01', 'yyyy-mm-dd')));


-- 3. 建立主鍵
alter table test_part add constraint test_part_pk_1 primary key (ID) using INDEX;

-- 4. 將 test_part_temp 表裡的資料遷移到 test_part 表中
insert into test_part_temp select * from test_part;

-- 5. 為分割槽表設定索引
-- Create/Recreate indexes 
create index test_part_create_time_1 on TEST_PART (create_time); 

-- 6. 刪除老的 test_part_temp 表
drop table test_part_temp purge;

-- 7. 作用是:允許分割槽表的分割槽鍵是可更新。
-- 當某一行更新時,如果更新的是分割槽列,並且更新後的列植不屬於原來的這個分割槽,
-- 如果開啟了這個選項,就會把這行從這個分割槽中 delete 掉,並加到更新後所屬的分割槽,此時就會發生 rowid 的改變。
-- 相當於一個隱式的 delete + insert ,但是不會觸發 insert/delete 觸發器。
alter table test_part enable row movement;

 

相關文章