设为首页 收藏本站
查看: 561|回复: 0

[经验分享] Oracle分区表和索引的创建与管理

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-1-9 08:51:55 | 显示全部楼层 |阅读模式
今天用到了Oracle表的分区,就顺便写几个例子把这个表的分区说一说:
一、创建分区表
1、范围分区
根据数据表字段值的范围进行分区
举个例子,根据学生的不同分数对分数表进行分区,创建一个分区表如下:
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) --优秀  
)  
创建完分区表后向表中添加一些数据:
declare   
  name     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;  

查询分区表:
--分别查询所有的,不及格的,中等的,优秀的成绩  
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) ;  

当我们的查询语句不指定分区的时候,如果分区字段出现在where条件之后,Oracle会自动根据字段值的范围扫描响应的分区:
select *  from  range_fraction  where fraction<30;    这句SQL执行的时候只会扫描不及格的分区
select *  from  range_fraction  where fraction<80;    这句SQL执行的时候会扫描不及格和中等两个分区

2、散列分区
在范围分区中,分区字段的连续值通常出现在一个分区内,而在散列分区中,连续的字段值不一定存储在相同的分区中。散列分区把记录分布在比范围分区更多的分区上,这减少了I/O争用的可能性。
为了创建一个散列分区,应该用partition by hash语句代替partition by range子句,如下所示:
第一种为各个分区指定不同的表空间,表空间数量不用等于分区数量,当表空间数量大于分区数量的时候会循环写入各个表空间:
<span style="font-family:SimSun;font-size:10px;">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)</span>  
第二种为每个分区指定一个分区名称并为其指定表空间:
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、列表分区
还可以使用列表分区代替范围分区和散列分区。在列表分区中,告诉Oracle所有可能的值,并指定应当插入相应行的分区。
我们将1、2、3、4班级的数据放在一个分区,将6、7、8的数据放在一个分区,将其他的再放在一个分区,建表如下:
<span style="font-family:SimSun;font-size:10px;">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,</span>  
<span style="font-family:SimSun;font-size:10px;">   partition p3 values(default)</span>  
<span style="font-family:SimSun;font-size:10px;">);</span>  

4、组合分区(创建子分区)
即分区的分区。例如可以先进行范围分区,再对各个范围分区创建列表分区。
对于非常大的表来说,这种组合分区是一种把数据分成可管理和可调整的组成部分的有效方法。
举个例子:按照分数范围分区后再将ID散列分区:
<span style="font-family:SimSun;font-size:10px;">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) --优秀  
)</span>  

二、索引分区
在分区表上可以建立三种类型的索引:1和普通表一样的全局索引;2.全局分区索引;3.本地分区索引
1.建立普通的索引
[sql] view plaincopy
create index index_fraction on range_fraction(fraction);  

2.建立本地分区索引(就是一个索引分区只能对应一个表分区)
create index  local_index_fraction on range_fraction(fraction) local;  

3.建立全局分区索引(属于散列索引分区,就是一个索引分区可能指向多个表分区)
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)  
);  
三、管理分区表
1、增加分区
对于范围分区来说,添加一个分区,必须该分区划定的界限高于原来的最大界限,也就是说只能往上加,不能往下加。那么对于用maxvalue关键字创建的范围分区就不能增加分区了
举例:
[sql] view plaincopy
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) --优秀  
)  
对于该分区我们增加一个分区:
ALTER TABLE range_fraction ADD PARTITION fraction_100 VALUES LESS THAN (100);  

为列表分区添加一个分区:
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);  
我们再为p3分区新增两个表分区值:
ALTER TABLE range_fraction MODIFY PARTITION p3 ADD VALUES(9,10);  
然后再将p3分区的表分区值中的10删掉:
ALTER TABLE range_fraction MODIFY PARTITION p3 DROP VALUES(10);  

为哈希分区添加一个子分区:
ALTER TABLE TABLENAME ADD PARTITION PARTNAME;  
添加一个子分区的格式:
ALTER TABLE TABLENAME MODIFY PARTITION PARTNAME ADD SUBPARTITION SUBPARTNAME;  
2、删除分区
删除分区比较简单,格式如下:
ALTER TABLE ... DROP PARTITION part_name;  
3、分区合并
合并父分区格式:
ALTER TABLE TABLENAME MERGE PARTITIONS p1-1, p1-2 INTO PARTITION p1 UPDATE INDEXES;  
如果省略了UPDATE INDEXES 的话需要为受影响的分区重建索引

合并子分区的格式:
ALTER TABLE TABLENAME  
MERGE SUBPARTITIONS part_1_sub_2, part_1_sub_3 INTO SUBPARTITION part_1_sub_2 UPDATE INDEXES;  

4、转换分区
可以将分区表转换成非分区表,或者几种不同分区表之间的转换。如下:
<span style="font-family:SimSun;font-size:10px;">CREATE TABLE hash_part02 AS SELECT * FROMhash_example WHERE 1=2;  
ALTER TABLE hash_example EXCHANGE PARTITIONpart02 WITH TABLE hash_part02;</span>  
这时,分区表hash_example中的part02分区的资料将被转移到hash_part02这个非分区表中。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-13667-1-1.html 上篇帖子: Oracle-07445[kgghash]:Oracle BUG导致更新LOB字段时进程被KILL掉 下篇帖子: Oracle ORA-12514的解决方法 Oracle
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表