一、創(chuàng)建分區(qū)表
站在用戶的角度思考問題,與客戶深入溝通,找到錫山網(wǎng)站設(shè)計(jì)與錫山網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請(qǐng)、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋錫山地區(qū)。
1、范圍分區(qū)
根據(jù)數(shù)據(jù)表字段值的范圍進(jìn)行分區(qū)
舉個(gè)例子,根據(jù)學(xué)生的不同分?jǐn)?shù)對(duì)分?jǐn)?shù)表進(jìn)行分區(qū),創(chuàng)建一個(gè)分區(qū)表如下:create table range_fraction(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by range(fraction)
(
partition fraction_60 values less than(60), --不及格partition fraction_80 values less than(85), --及格partition fraction_100 values less than(maxvalue) --優(yōu)秀)創(chuàng)建完分區(qū)表后向表中添加一些數(shù)據(jù):declarename varchar2(10);
fraction number(5);
grade number(5);
i number(8):=1;
begin
for i in 1..100000 LOOP
SELECT CHR (ROUND (DBMS_RANDOM.VALUE (97, 122))) INTO NAME FROM DUAL;SELECT ABS(MOD(DBMS_RANDOM.RANDOM,101)) into fraction FROM DUAL;SELECT ABS(MOD(DBMS_RANDOM.RANDOM,10))+1 into grade FROM DUAL;insert into range_fraction values(seq_range_fraction.nextval ,name,fraction,grade);END LOOP;end;
查詢分區(qū)表:--分別查詢所有的,不及格的,中等的,優(yōu)秀的成績(jī)select * from range_fraction;select * from range_fraction partition(fraction_60) ;select * from range_fraction partition(fraction_80) ;select * from range_fraction partition(fraction_100) ;當(dāng)我們的查詢語句不指定分區(qū)的時(shí)候,如果分區(qū)字段出現(xiàn)在where條件之后,Oracle會(huì)自動(dòng)根據(jù)字段值的范圍掃描響應(yīng)的分區(qū):
select * from range_fraction where fraction30; 這句SQL執(zhí)行的時(shí)候只會(huì)掃描不及格的分區(qū)select * from range_fraction where fraction80; 這句SQL執(zhí)行的時(shí)候會(huì)掃描不及格和中等兩個(gè)分區(qū)2、散列分區(qū)在范圍分區(qū)中,分區(qū)字段的連續(xù)值通常出現(xiàn)在一個(gè)分區(qū)內(nèi),而在散列分區(qū)中,連續(xù)的字段值不一定存儲(chǔ)在相同的分區(qū)中。散列分區(qū)把記錄分布在比范圍分區(qū)更多的分區(qū)上,這減少了I/O爭(zhēng)用的可能性。
為了創(chuàng)建一個(gè)散列分區(qū),應(yīng)該用partition by hash語句代替partition by range子句,如下所示:
第一種為各個(gè)分區(qū)指定不同的表空間,表空間數(shù)量不用等于分區(qū)數(shù)量,當(dāng)表空間數(shù)量大于分區(qū)數(shù)量的時(shí)候會(huì)循環(huán)寫入各個(gè)表空間:
create table range_fraction1
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by hash(fraction)
partitions 8
store in (users,tbs_haicheng)
第二種為每個(gè)分區(qū)指定一個(gè)分區(qū)名稱并為其指定表空間:create table range_fraction1(
id number(8),
name varchar2(20),
fraction number(3),
grade number(1)
)
partition by hash(fraction)
(
partition p1 tablespace tbs_haicheng ,
partition p2 tablespace users
);
3、列表分區(qū)
還可以使用列表分區(qū)代替范圍分區(qū)和散列分區(qū)。在列表分區(qū)中,告訴Oracle所有可能的值,并指定應(yīng)當(dāng)插入相應(yīng)行的分區(qū)。
我們將1、2、3、4班級(jí)的數(shù)據(jù)放在一個(gè)分區(qū),將6、7、8的數(shù)據(jù)放在一個(gè)分區(qū),將其他的再放在一個(gè)分區(qū),建表如下:
create table range_fraction1
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by list(grade)
(
partition p1 values(1,2,3,4) tablespace tbs_haicheng ,partition p2 values(5,6,7,8) tablespace users,?
1
partition p3 values(default)
4、組合分區(qū)(創(chuàng)建子分區(qū))
即分區(qū)的分區(qū)。例如可以先進(jìn)行范圍分區(qū),再對(duì)各個(gè)范圍分區(qū)創(chuàng)建列表分區(qū)。
對(duì)于非常大的表來說,這種組合分區(qū)是一種把數(shù)據(jù)分成可管理和可調(diào)整的組成部分的有效方法。
舉個(gè)例子:按照分?jǐn)?shù)范圍分區(qū)后再將ID散列分區(qū):
create table range_fraction1
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(1)
)
partition by range(fraction)
subpartition by hash(id)
subpartitions 4
(
partition fraction_60 values less than(60), --不及格partition fraction_80 values less than(85), --及格partition fraction_100 values less than(maxvalue) --優(yōu)秀)二、索引分區(qū)
在分區(qū)表上可以建立三種類型的索引:1和普通表一樣的全局索引;2.全局分區(qū)索引;3.本地分區(qū)索引1.建立普通的索引create index index_fraction on range_fraction(fraction);2.建立本地分區(qū)索引(就是一個(gè)索引分區(qū)只能對(duì)應(yīng)一個(gè)表分區(qū))?
create index local_index_fraction on range_fraction(fraction) local;3.建立全局分區(qū)索引(屬于散列索引分區(qū),就是一個(gè)索引分區(qū)可能指向多個(gè)表分區(qū))?
create index global_index_fraction on range_fraction(fraction)GLOBAL partition by range(fraction)(
part_01 values less than(1000),
part_02 values less than(MAXVALUE)
);
三、管理分區(qū)表
1、增加分區(qū)
對(duì)于范圍分區(qū)來說,添加一個(gè)分區(qū),必須該分區(qū)劃定的界限高于原來的最大界限,也就是說只能往上加,不能往下加。那么對(duì)于用maxvalue關(guān)鍵字創(chuàng)建的范圍分區(qū)就不能增加分區(qū)了舉例:
create table range_fraction
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by range(fraction)
(
partition fraction_60 values less than(40), --不及格partition fraction_80 values less than(60), --及格partition fraction_100 values less than(80) --優(yōu)秀)對(duì)于該分區(qū)我們?cè)黾右粋€(gè)分區(qū):
ALTER TABLE range_fraction ADD PARTITION fraction_100 VALUES LESS THAN (100);為列表分區(qū)添加一個(gè)分區(qū):
create table range_fraction
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by list(grade)
(
partition p1 values(1,2,3) tablespace tbs_haicheng ,partition p2 values(4,5,6) tablespace users);ALTER TABLE range_fraction ADD partition p3 VALUES (7,8);我們?cè)贋閜3分區(qū)新增兩個(gè)表分區(qū)值:
ALTER TABLE range_fraction MODIFY PARTITION p3 ADD VALUES(9,10);然后再將p3分區(qū)的表分區(qū)值中的10刪掉:
ALTER TABLE range_fraction MODIFY PARTITION p3 DROP VALUES(10);為哈希分區(qū)添加一個(gè)子分區(qū):
ALTER TABLE TABLENAME ADD PARTITION PARTNAME;添加一個(gè)子分區(qū)的格式:
ALTER TABLE TABLENAME MODIFY PARTITION PARTNAME ADD SUBPARTITION SUBPARTNAME;2、刪除分區(qū)刪除分區(qū)比較簡(jiǎn)單,格式如下:
ALTER TABLE ... DROP PARTITION part_name;3、分區(qū)合并合并父分區(qū)格式:ALTER TABLE TABLENAME MERGE PARTITIONS p1-1, p1-2 INTO PARTITION p1 UPDATE INDEXES;如果省略了UPDATE INDEXES 的話需要為受影響的分區(qū)重建索引合并子分區(qū)的格式:
ALTER TABLE TABLENAME
MERGE SUBPARTITIONS part_1_sub_2, part_1_sub_3 INTO SUBPARTITION part_1_sub_2 UPDATE INDEXES;4、轉(zhuǎn)換分區(qū)可以將分區(qū)表轉(zhuǎn)換成非分區(qū)表,或者幾種不同分區(qū)表之間的轉(zhuǎn)換。如下:
CREATE TABLE hash_part02 AS SELECT * FROMhash_example WHERE 1=2;ALTER TABLE hash_example EXCHANGE PARTITIONpart02 WITH TABLE hash_part02;這時(shí),分區(qū)表hash_example中的part02分區(qū)的資料將被轉(zhuǎn)移到hash_part02這個(gè)非分區(qū)表中。
1、一般分區(qū)表都會(huì)很大,所以可以先創(chuàng)建表空間,為了讓分區(qū)表存放到單獨(dú)的表空間,否則默認(rèn)會(huì)存放到USERS表空間
2、創(chuàng)建TABLESPACE TS1:
CREATE TABLESPACE TS1 DATAFILE '/data1/oracle/test.dbf' SIZE 512M AUTOEXTEND ON NEXT 512M MAXSIZE UNLIMITED;
3、創(chuàng)建分區(qū)表,需要確定按什么分區(qū),比如按id或按時(shí)間段:
CREATE TABLE test_201602
(
ID NUMBER(10) NOT NULL,
CREATE_TIME DATE,
)
TABLESPACE TS1
PARTITION BY LIST (ID)
(PARTITION PT_1001 VALUES (1001) TABLESPACE TS1);
4、繼續(xù)增加分區(qū)
ALTER TABLE test_201602 ADD PARTITION "PT_1003" VALUES (1003) LOGGING NOCOMPRESS;
ALTER TABLE test_201602 ADD PARTITION "PT_1004" VALUES (1004) LOGGING NOCOMPRESS;
5、查詢表及分區(qū)數(shù)量
select TABLE_NAME,PARTITION_COUNT,DEF_TABLESPACE_NAME from USER_PART_TABLES order by DEF_TABLESPACE_NAME;
可以的,比如有分區(qū)表如下:
create?table?test
(
msg_id??????VARCHAR2(16),
result??????INTEGER,
ts??????????VARCHAR2(17),
ts_time?????TIMESTAMP(6),
insert_time?DATE)
partition?by?range?(TS_TIME)
(
partition?P20180110?values?less?than?(TIMESTAMP'?2018-01-11?00:00:00')
tablespace?USERS
pctfree?10
initrans?1
maxtrans?255
storage
(
initial?64K??????next?1M
minextents?1
maxextents?unlimited
)
);
如果想增加分區(qū):
alter?table?test?add??partition?P20180112?values?less?than?(to_date('20180113?00:00:00','yyyymmdd?hh24:mi:ss'));
1、創(chuàng)建語句
create table p(id number)
partition by range(id)
(partition p1 values less than(100) tablespace t1,
partition p2 values less than(200) tablespace t2,
partition p3 values less than(300) tablespace t3);
2、添加分區(qū)
alter table p add partition p4 values less than (400) tablespace t4;
3、清除分區(qū)數(shù)據(jù)
alter table p trunc partition p1;
4、刪除分區(qū)
alter table p drop partition p1;
如果是分區(qū)表可以添加分區(qū),如果不是分區(qū)表,可以把表轉(zhuǎn)換成分區(qū)表,再增加分區(qū)。