【摘要】 分區(qū)表在大型數(shù)據(jù)庫(kù)特別是分布式數(shù)據(jù)庫(kù)中占有重要地位,分區(qū)是一種“分而治之”的技術(shù),為大量數(shù)據(jù)提供了可伸縮的性能,提高了對(duì)巨型數(shù)據(jù)庫(kù)的讀寫和查詢速度。本文主要研究了分布式數(shù)據(jù)庫(kù)Oralce 中的List分區(qū)表和Range分區(qū)表的創(chuàng)建與應(yīng)用,探討了其切割和分區(qū)表的修改技術(shù)。從而可以類推分區(qū)表在其它數(shù)據(jù)庫(kù)關(guān)系系統(tǒng)如大數(shù)據(jù)中Hive中的應(yīng)用。
【關(guān)鍵字】 大型數(shù)據(jù)庫(kù)Oracle list分區(qū)表 range 分區(qū)表 分區(qū)表的切割
一、引言
分區(qū)表應(yīng)用在大型的分布數(shù)據(jù)庫(kù)中,分區(qū)是一種“分而治之”的技術(shù),通過將大表引分成可以管理的小塊,從而避免了對(duì)每個(gè)表作為一個(gè)大的、單獨(dú)的對(duì)象進(jìn)行管理,為大量數(shù)據(jù)提供了可伸縮的性能,提高了巨型數(shù)據(jù)庫(kù)的讀寫和查詢速度。
分區(qū)表是將一個(gè)大的表分割成較小的片段(分區(qū)),在實(shí)際應(yīng)用中,分區(qū)表的操作是在獨(dú)立的分區(qū)上,但是對(duì)用戶而言是透明的 [1][2] 。Oracle提供了分區(qū)技術(shù)以支持VLDB(Very Large DataBase)。分區(qū)表通過對(duì)分區(qū)列的判斷,把分區(qū)列不同的記錄,放到不同的分區(qū)中。分區(qū)完全對(duì)應(yīng)用透明。Oracle的分區(qū)表可以包括多個(gè)分區(qū),每個(gè)分區(qū)都是一個(gè)獨(dú)立的段(SEGMENT),可以存放到不同的表空間中。查詢時(shí)可以通過查詢表來(lái)訪問各個(gè)分區(qū)中的數(shù)據(jù),也可以通過在查詢時(shí)直接指定分區(qū)的方法來(lái)進(jìn)行查詢。
分區(qū)表的主要優(yōu)點(diǎn)為:
(1)由于將數(shù)據(jù)分散到各個(gè)分區(qū)中,減少了數(shù)據(jù)損壞的可能性;(2)可以對(duì)單獨(dú)的分區(qū)進(jìn)行備份和恢復(fù);(3)可以將分區(qū)映射到不同的物理磁盤上,來(lái)分散IO;(4)提高可管理性、可用性和性能。
什么時(shí)候需要分區(qū)表,官網(wǎng)給出了2個(gè)建議:
(1)Tables greater than 2GB should always be considered for partitioning.
(2)Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current months data is updatable and the other 11 months are read only.
二、分區(qū)表的創(chuàng)建和應(yīng)用
Oracle 10g以上版本提供了以下幾種分區(qū)類型:
(1)范圍分區(qū)(range);(2)哈希分區(qū)(hash);(3)列表分區(qū)(list);(4)范圍-哈希復(fù)合分區(qū)(range-hash);(5)范圍-列表復(fù)合分區(qū)(range-list)。
這里以應(yīng)用廣泛的list分區(qū)和range分區(qū)為例說(shuō)明分區(qū)表的應(yīng)用。
2.1 list 分區(qū)表
List分區(qū)(列表分區(qū)): 通過列表方法(指定字符串值方法)進(jìn)行分區(qū)。 List分區(qū)表需要考慮分區(qū)的依據(jù),分區(qū)的名字,分區(qū)值(或者值的區(qū)域)每個(gè)分區(qū)所在的表空間。在分區(qū)時(shí)必須確定分區(qū)列可能存在的值,一旦插入的列值不在分區(qū)范圍內(nèi),則插入/更新就會(huì)失敗,因此通常建議使用list分區(qū)時(shí),要?jiǎng)?chuàng)建一個(gè)default分區(qū)存儲(chǔ)那些不在指定范圍內(nèi)的記錄,類似range分區(qū)中的maxvalue分區(qū)。
create table part_book1
( bid number(4),
bookname VARCHAR2(20),
bookpress VARCHAR2(30),
booktime date)
partition by list(bookpress)
(partition part1 values(‘清華大學(xué)出版社) tablespace system,
partition part2 values(‘教育出版社) tablespace users); list分區(qū)表的插入同普通表,如下:
SQL> insert into part_book1 values(1,oralce,清華大學(xué)出版社,to_date(‘20110102,yyyymmdd));
SQL> insert into part_book1 values(2,音樂基礎(chǔ)欣賞,教育出版社,to_date(‘20120102,yyyymmdd));
list分區(qū)表可以分區(qū)查詢,如下:
SQL> select * from part_book1 partition(part1);
創(chuàng)建或修改分區(qū)時(shí),可以指定default,把非分區(qū)規(guī)則的數(shù)據(jù),全部放到這個(gè)default分區(qū),如除了清華大學(xué)出版社, ‘教育出版社之外的出版社,放到分區(qū)表part_book1的part3分區(qū)中。
SQL> alter table part_book1 add partition part3 values(default) tablespace system;
與分區(qū)表相關(guān)的數(shù)據(jù)字典:dba_part_tables,dba_tab_ partitions等等。
2.2 range 分區(qū)表
Range 分區(qū)表是應(yīng)用范圍比較廣的表分區(qū)方式[3][4],范圍分區(qū)就是對(duì)數(shù)據(jù)表中的某個(gè)值的范圍進(jìn)行分區(qū),根據(jù)某個(gè)值的范圍,決定將該數(shù)據(jù)存儲(chǔ)在哪個(gè)分區(qū)上。它是以列的值的范圍來(lái)做為分區(qū)的劃分條件,將記錄存放到列值所在的range分區(qū)中。
比如按照時(shí)間劃分,某大型企業(yè)的數(shù)據(jù)2015 年1 季度的數(shù)據(jù)放到a 分區(qū),2015年2 季度的數(shù)據(jù)放到b分區(qū),因此在創(chuàng)建的時(shí)候,需要指定基于的列,以及分區(qū)的范圍值。若某些記錄暫無(wú)法預(yù)測(cè)范圍,可創(chuàng)建maxvalue 分區(qū),所有不在指定范圍內(nèi)的記錄會(huì)存儲(chǔ)maxvalue 區(qū)。
建立range分區(qū)表分區(qū)表需要考慮分區(qū)的依據(jù),分區(qū)的名字,分區(qū)值(或者值的區(qū)域)每個(gè)分區(qū)所在的表空間。values less than:后跟分區(qū)范圍值(如果依賴列有多個(gè),范圍對(duì)應(yīng)值也應(yīng)是多個(gè),中間以逗號(hào)分隔);
create table part_book
( bid number(4),
bookname VARCHAR2(20),
bookpress VARCHAR2(30),
booktime date)
partition by range(booktime)
(partition part1 values less than(to_ date(‘20100101,yyyymmdd)) tablespace system,
partition part2 values less than (to_ date(‘20120101,yyyymmdd)) tablespace users,
partition part3 values less than (MAXVALUE) tablespace users
);
insert into part_book values(1,oracle,清華大學(xué)出版社,to_date(‘20110102,yyyymmdd));
insert into part_book values(2,oracle,清華大學(xué)出版社,to_date(‘20090101,yyyymmdd));
Range 分區(qū)表用過一段時(shí)間之后,若需要增加新的分區(qū),可以對(duì)range分區(qū)表進(jìn)行切割[5]。Range 分區(qū)切割的位置為在分區(qū)表中間或者開始處或者帶有maxvalue值的尾處增加分區(qū)。其語(yǔ)法格式如下:
ALTER TABLE 表名 SPLIT PARTITION 分區(qū)的名字 AT(值) INTO (PARTITION 新分區(qū)的名字1 ,PARTITION 新分區(qū)的名字2)
分區(qū)表的切割舉例:將part3分區(qū)切割為兩個(gè)新的分區(qū),名字為part3、part4,分區(qū)的的依據(jù)值為20140101.
alter table part_book4
s p l i t p a r t i t i o n p a r t 3 a t ( t o _ date(‘20140101,yyyymmdd))
into(partition part3,partition part4);
Range 分區(qū)表的插入和查詢操作同 list分區(qū)表,在這里不再贅述。 另外對(duì)于組合分區(qū):如果某表按照某列分區(qū)之后,仍然較大,或者是一些其它的需求,還可以通過分區(qū)內(nèi)再建子分區(qū)的方式將分區(qū)再分區(qū),即組合分區(qū)的方式。
三、總結(jié)
分區(qū)表提高了大型、巨型數(shù)據(jù)庫(kù)的讀寫和查詢速度,為大量數(shù)據(jù)的存儲(chǔ)、讀取提供了可伸縮性能,本文主要研究了分布式數(shù)據(jù)庫(kù)Oracle 中的List分區(qū)表和Range分區(qū)表的創(chuàng)建與應(yīng)用,探討了其切割和分區(qū)表的修改技術(shù)。
參 考 文 獻(xiàn)
[1] 王立君.并行多媒體數(shù)據(jù)庫(kù)中基于內(nèi)容的高效檢索的數(shù)據(jù)分配方法的研究. [J]科學(xué)技術(shù)與工程,2013.13(9),2544-2548
[2] 郭晉秦, 韓 焱. 大型數(shù)據(jù)庫(kù)聚類中偽裝危險(xiǎn)數(shù)據(jù)識(shí)別方法研究. 計(jì)算機(jī)仿真 2015.433-436 32(11)
[3] 徐洪麗,王志軍.認(rèn)知策略與知識(shí)結(jié)構(gòu)化的研究與應(yīng)用-以大型數(shù)據(jù)庫(kù)學(xué)習(xí)為例. 高教學(xué)刊. 2016.3 73-74.
[4] 李亞龍, 朱巖. 表分區(qū)在分界開關(guān)監(jiān)控系統(tǒng)數(shù)據(jù)庫(kù)的應(yīng)用.2016(25)2: P235-237
[5] 史斌.大型數(shù)據(jù)庫(kù)管理系統(tǒng) Oracle 體系結(jié)構(gòu). 電腦編程技巧與維護(hù). 2010.18:p72-74