一、Oracle數據庫表分區概念和理解
1.1、已經存在的表沒有方法可以直接轉化為分區表。
1.2、不在分區字段上建立分區索引,在別的字段上建立索引相當於全局索引。效率低。
1.3、表空間概念:
表空間指的是是一個或多個數據文件的集合,所有的數據對象都存放在指定的表空間中,但主要存放的是表, 所以稱作表空間。
1.4、分區表概念
當表中的數據量不斷增大,查詢數據的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對表進行分區。表進行分區后,邏輯上表仍然是一張完整的表,只是將表中的數據在物理上存放到多個表空間(物理文件上),這樣查詢數據時,不至於每次都掃描整張表。
二、Oracle數據庫表分區的幾種類型
2.1、范圍分區(Range分區)
范圍分區將數據基於范圍映射到每一個分區,這個范圍是你在創建分區時指定的分區鍵決定的。這種分區方式是最為常用的,並且分區鍵經常采用日期
1)每一個分區都必須有一個VALUES LESS THEN子句,它指定了一個不包括在該分區中的上限值。分區鍵的任何值等於或者大於這個上限值的記錄都會被加入到下一個高一些的分區中。
2) 所有分區,除了第一個,都會有一個隱式的下限值,這個值就是此分區的前一個分區的上限值。
3) 在最高的分區中,MAXVALUE被定義。MAXVALUE代表了一個不確定的值。這個值高於其它分區中的任何分區鍵的值,也可以理解為高於任何分區中指定的VALUE LESS THEN的值,同時包括空值。
例子 按時間划分
1 CREATE TABLE ORDER_ACTIVITIES 2 ( 3 ORDER_ID NUMBER(7) NOT NULL, 4 ORDER_DATE DATE, 5 TOTAL_AMOUNT NUMBER, 6 CUSTOTMER_ID NUMBER(7), 7 PAID CHAR(1) 8 ) 9 PARTITION BY RANGE (ORDER_DATE) 10 ( 11 PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')), 12 PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) , 13 PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) 14 );
例子MAXVALUE
1 CREATE TABLE RangeTable 2 ( 3 idd INT PRIMARY KEY , 4 iNAME VARCHAR(10), 5 grade INT 6 ) 7 PARTITION BY RANGE (grade) 8 ( 9 PARTITION part1 VALUES LESS THEN (1000) , 10 PARTITION part2 VALUES LESS THEN (MAXVALUE) 11 );
三、分區的一些操作
3.1、查看分區情況
1 select * from user_tab_partitions where table_name ='tableName';
3.2、查看分區數據
1 select * from tablename partiton(p1);
3.3、修改分區
1 添加:alter table tablename add partition p4 values less than(value); 2 刪除:alter table tablename drop partiton p4; 3 截斷分區 截斷某個分區是指刪除某個分區中的數據,並不會刪除分區,也不會刪除其它分區中的數據。 4 alter table tablename truncate partiton p2;
3.4、合並分區
合並分區是將相鄰的分區合並成一個分區,結果分區將采用較高分區的界限,值得注意的是,不能將分區合並到界限較低的分區。以下代碼實現了P1 P2分區的合並:
1 ALTER TABLE TABLENAME MERGE PARTITIONS P1,P2 INTO PARTITION P2;
3.5、拆分分區
拆分分區將一個分區拆分兩個新分區,拆分后原來分區不再存在。注意不能對HASH類型的分區進行拆分。
1 ALTER TABLE TABLENAME SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);
更新數據是操作時不可以跨分區操作,會出現錯誤,需要設置可移動的分區才能進行跨分區查詢。
1 alter table tablename enable row movement;
四、Oracle11g數據庫新特性之間隔分區
在Oracle10g中,沒有定義間隔分區,只能通過范圍分區實現間隔分區功能,如果要實現自動創建分區,只能通過創建JOB或者scheduler來實現;而在11g中,Oracle直接提供了間隔分區功能,大大簡化了間隔分區的實現。
語法
主要通過INTERVAL關鍵字來實現
1 CREATE TABLE interval_sales 2 ( prod_id NUMBER(6) 3 , cust_id NUMBER 4 , time_id DATE 5 , channel_id CHAR(1) 6 , promo_id NUMBER(6) 7 , quantity_sold NUMBER(3) 8 , amount_sold NUMBER(10,2) 9 ) 10 PARTITION BY RANGE (time_id) 11 INTERVAL(NUMTOYMINTERVAL(1, \'MONTH\')) 12 ( PARTITION p0 VALUES LESS THAN (TO_DATE(\'1-1-2008\', \'DD-MM-YYYY\')), 13 PARTITION p1 VALUES LESS THAN (TO_DATE(\'1-1-2009\', \'DD-MM-YYYY\')), 14 PARTITION p2 VALUES LESS THAN (TO_DATE(\'1-7-2009\', \'DD-MM-YYYY\')), 15 PARTITION p3 VALUES LESS THAN (TO_DATE(\'1-1-2010\', \'DD-MM-YYYY\')) )
上述sql語句創建了4個不等區間的分區,分別是2008年1月1日之前的所有數據、08年到09年的所有數據、09年上半年的所有數據、09年下半年的所有數據;同時,它也制定了在2010年1月1日之后,每個月單獨創建一個分區。需要注意一點,間隔分區的鍵值只能是一個列,並且該列只能是Date類型或者number類型。
五、Oracle數據庫表分區索引簡單介紹
分區之后雖然可以提高查詢效率,但也僅僅是提供了數據的范圍,所以我們在有必要的情況下,需要在分區內建立索引,進一步提高效率。分區索引分為兩類。一類叫做local。一類叫做global。
local:每個分區上都建立索引(本地索引)
global:一種是在全局上建立索引,這種方式分布分區都一樣,一般不使用。
前綴索引:還有一種就是自定義數據區間的索引。也叫作前綴索引,這個是非常有意義的,自定義區間值必須使用MAXVALUE。另外一點是在分區上建立的索引必須是分區字段列。
本地索引
1 create index grade_index on tablename(grade) local
例子:在p1和p2和p3三個分區上分別建立索引
1 create index grade_index on studentgrade(grade) 2 local --根據表分區創建本地索引分區 3 ( 4 partition p1, 5 partition p2, 6 partition p3 7 );
查看分區索引
1 select * from user_ind_partitions;
全局索引
1 create index idxname on tablename (field) global;
前綴索引
1 create index idxname on tablename(field) global partition by range(field){ 2 partition p1 values less than(value), 3 partition p2 values less than(maxvalue) 4 };