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