利用DB2表分區的功能對大數據量的表進行分區,可以優化查詢。
表分區介紹:
表分區是一種數據組織方案,它根據一列或多列中的值把表數據划分為多個稱為數據分區 的存儲對象。
(我覺得表分區就類似於Windows系統的磁盤分區,通常我們將磁盤分區成:系統盤,娛樂盤,學習盤,工作盤。如果我想找一個《Thinking in java》的電子書,我們會直接去學習盤去搜索,相反,如果我們電腦只分一個區,那么我們必須要搜索整塊硬盤。)
When需要進行表分區:
在數據倉庫中,事實表或歷史表的大小是擺在設計人員和管理員面前的一個挑戰。這些表通常包含數億行數據,有時候甚至包含數千億行數據。對於這種規模的表,主要關心以下幾點:
- 查詢性能
- 將大量新數據插入到這些表中
- 每月或每個季度刪除大量過時的數據
(我覺得分區表主要用在記錄型表中,表中數據按時間日期進行累計,記錄的可利用性隨時間的流逝逐漸變小,歷史數據不會被使用或者被利用的可能性很小)
How建立表分區:
create table person1(
id varchar(32) NOT NULL,
p_name varchar(32),
p_age INTEGER,
birthday DATE,
job char(32)
) partition by range(birthday)(
starting minvalue ending ‘9/1/2013’ exclusive,
starting '9/1/2013' ending '9/1/2014’ exclusive every(1 months)
);
DB2使用partition by range對表字段進行分區,利用starting 開始時間 ending 結束時間指定分區范圍。上面紅色部分首先建立一個最小時間值到2013-9-1(exclusive表示不包括2313-9-1這一天)的一個分區,第二個starting是自動建立多個分區,建立一個從2013-9-1到2014-9-1時間范圍每月建立一個分區,也就是12個分區。這里沒有指定分區名稱,系統默認提供分區名是PART0,PART1,PART2….
How添加一個分區:
ALTER TABLE DB2INST1.PERSON1 ADD PARTITION PART13 STARTING FROM ('2014-9-1') INCLUSIVE ENDING AT ('2014-10-1') EXCLUSIVE IN PERSON_SP2 ;
添加一個范圍是2014-9-1到2014-10-1的PART13分區。
分區過多怎么辦:
分區按時間進行,歷史分區太過,想刪除一些歷史分區怎么辦?DB2提供了一個拆離的功能,可以將歷史分區數據從表中分離(滾出)出去,放在其他表中。
ALTER TABLE DB2INST1.PERSON1 DETACH PARTITION PART1 INTO TABLE DB2INST1.PERSON_HISTORY;
分離后再加入怎么辦:
DB2有連接(滾入)功能,可以連接一張表,將制定表中的數據連接到一個分區中。
ALTER TABLE DB2INST1.PERSON1 ATTACH PARTITION PART1 STARTING FROM ('2013-9-1') INCLUSIVE ENDING AT ('2013-10-1') EXCLUSIVE FROM TABLE DB2INST1.PERSON_HISTORY;
報警表推薦方案:
報警表單日數據量部局可達10萬級,建議采用兩張表,一張為事實表,一張為歷史表,事實表按天進行分區,歷史表按年進行分區。
1、 初始化表建立一個月的分區,后每個月末建立下個月的分區;
2、 一年后拆離(滾出)上一年上半年的分區數據至歷史表;
3、 為了加快查詢速度,建議在查詢條件主要字段上建立索引;
4、 報警表建立獨立表空間。