範圍分割槽在資料過期化處理中的應用
在海量資料的資料庫設計中,可能需要提前考慮資料庫中資料儲存的時間問題,或者叫做資料的過期化問題,它的意思是,由於資料量太大,在資料庫中只保留特定時長的資料,比如1年,1年前的資料就需要做過期化(歸檔化)處理。
這時候範圍分割槽就能發揮非常好的作用,就像上面的例子一樣,我們可以將表做成每月1個分割槽,超過1年的分割槽可以按照使用者的需求來進行處理。
對於過期的資料,通常有以下幾種處理方式。
1.刪除
處理歷史資料的方式相當簡單,直接刪除過期的分割槽以及分割槽上的資料(如果每個分割槽分配乙個表空間,那麼可以連帶表空間也刪除,直接釋放磁碟空間),釋放空間。
在實際生產過程中,為了減少人為干預導致的失誤,可以寫乙個定時任務來完成這樣的操作,比如下面的例子。
還是上面的那個表,每個月乙個分割槽。
createtable sale_data
(sale_id number(5),
salesman_namevarchar2(30),
sales_amount number(10),
sales_date date)
partition by range(sales_date)
partition sales_2009_1 values lessthan(to_date('01/02/2009','dd/mm/yyyy')),
partition sales_2009_2 values lessthan(to_date('01/03/2009','dd/mm/yyyy')),
partition sales_2009_3 values lessthan(to_date('01/04/2009','dd/mm/yyyy')),
partition sales_2009_4 values lessthan(to_date('01/05/2009','dd/mm/yyyy')),
partition sales_2009_5 values lessthan(to_date('01/06/2009','dd/mm/yyyy')),
partition sales_2009_6 values lessthan(to_date('01/07/2009','dd/mm/yyyy')),
partition sales_2009_7 values less than(to_date('01/08/2009','dd/mm/yyyy')),
partition sales_2009_8 values lessthan(to_date('01/09/2009','dd/mm/yyyy')),
partition sales_2009_9 values lessthan(to_date('01/10/2009','dd/mm/yyyy')),
partition sales_2009_10 values lessthan(to_date('01/11/2009','dd/mm/yyyy')),
partition sales_2009_11 values lessthan(to_date('01/12/2009','dd/mm/yyyy')),
partition sales_2009_12 values lessthan(to_date('01/01/2010','dd/mm/yyyy')),
partition sales_2010_1 values lessthan(to_date('01/02/2010','dd/mm/yyyy'))
使用下面這樣的乙個儲存過程,通過建立乙個job,我們就可以定時刪除1年以前的舊分割槽了。
create or replace procedure drop_partitionas
v_part_name varchar2(100); --要新增分割槽表的名稱字首
v_over_time number; --過期時間間隔
v_err_num number; --ora錯誤號
v_err_msg varchar2(100); --錯誤描述
begin
--得到時間最早的分割槽
select min(partition_name) into v_part_name
from user_tab_partitions where table_name='sale_data';
--取得時間最早的分割槽到當前的時間間隔
selectmonths_between(sysdate,to_date(substr(min(partition_name),7,8),'yyyy-mm')) into v_over_time
from user_tab_partitions where table_name='sale_data';
--刪除最早的分割槽
if v_over_time>12 then
execute immediate 'alter table sale_datadrop partition '||v_part_name;
end if;
exception
when others then
v_err_num := sqlcode;
v_err_msg := substr(sqlerrm, 1, 100);
dbms_output.put_line('執行錯誤: ' ||v_err_num || '錯誤描述: ' || v_err_msg);
end drop_partition;
建立乙個job,每天執行一次。
declare
job number;
begin
dbms_job.submit(job,'drop_partition;',sysdate,'sysdate+1');
end;
這樣就可以定時刪除過期的分割槽資料了。
2.移植到離線資料庫中,作為歷史資料處理
對於一些olap系統,業務上通常會考慮對資料進行過期化處理,將過期的資料移植到另外的資料庫中儲存,這種資料庫稱作離線資料庫或者歷史資料庫。
將一部分業務切換到歷史資料庫中,然後對歷史資料進行分析處理,比如資料探勘、報表分析等。
下面舉乙個具體的案例來說明這個過程。
(2)每個分割槽建立在單獨的表空間上。
(3)將分割槽的表空間匯出,並複製到離線資料庫伺服器上。
(4)在離線資料庫伺服器上將複製過來的資料匯入到離線資料庫中。
這樣就完成了乙個分割槽資料的過期化處理。
3.從資料庫中移除,轉入歸檔
在實際生產環境中,第三種對歷史資料的處理方式是對歷史資料歸檔,它是一種折中的方式,在成本上比離線資料庫要低,但是還能保留歷史資料。此處理方式需要乙個海量的儲存空間來儲存過期的資料。
對於過期資料的歸檔處理,通常有兩種方式:
(1)對於資料是通過對平面檔案或者專有格式檔案載入的方式入庫的,比如資料倉儲,則可以考慮在載入的同時,將這些資料檔案歸檔到目標儲存上面,完成資料備份。
Oracle 已存在資料的大表 改 分割槽表
建立表,插入測試資料 create table create table lxw test cdate date,t1 number,t2 varchar2 2 insert into lxw test cdate,t1,t2 values to date 2020 07 01 yyyy mm dd...
oracle表範圍分割槽的測試例子
create sequence create sequence sq1 minvalue 1 maxvalue 999999999999999999999999999 start with 2001 increment by 1 cache 20 序列的建立 create table testpat...
oracle表範圍分割槽的測試例子
create sequence create sequence sq1 minvalue 1 maxvalue 999999999999999999999999999 start with 2001 increment by 1 cache 20 序列的建立 create table testpat...