(转)Oracle分区表和索引的创建与管理
今天用到了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子句,如下所示:
第一种为各个分区指定不同的表空间,表空间数量不用等于分区数量,当表空间数量大于分区数量的时候会循环写入各个表空间:
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)
第二种为每个分区指定一个分区名称并为其指定表空间:
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的数据放在一个分区,将其他的再放在一个分区,建表如下:
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,
partition p3 values(default)
);
4、组合分区(创建子分区)
即分区的分区。例如可以先进行范围分区,再对各个范围分区创建列表分区。
对于非常大的表来说,这种组合分区是一种把数据分成可管理和可调整的组成部分的有效方法。
举个例子:按照分数范围分区后再将ID散列分区:
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) --优秀
)
二、索引分区
在分区表上可以建立三种类型的索引:1和普通表一样的全局索引;2.全局分区索引;3.本地分区索引
1.建立普通的索引
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关键字创建的范围分区就不能增加分区了
举例:
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、转换分区
可以将分区表转换成非分区表,或者几种不同分区表之间的转换。如下:
CREATE TABLE hash_part02 AS SELECT * FROMhash_example WHERE 1=2;
ALTER TABLE hash_example EXCHANGE PARTITIONpart02 WITH TABLE hash_part02;
这时,分区表hash_example中的part02分区的资料将被转移到hash_part02这个非分区表中。
(转)Oracle分区表和索引的创建与管理的更多相关文章
- 转 :Oracle分区表 (Partition Table) 的创建及管理
三.删除分区 You can drop partitions from range, list, or composite range-list partitioned tables. ALTER T ...
- oracle分区表按时间自动创建
表分区是一种思想,分区表示一种技术实现.当表的大小过G的时候可以考虑进行表分区,提高查询效率,均衡IO.oracle分区表是oracle数据库提供的一种表分区的实现形式.表进行分区后,逻辑上仍然是一张 ...
- 【Oracle 】tablespace 表空间创建和管理
1.表空间的概述 1. 表空间是数据库的逻辑组成部分. 2. 从物理上讲,数据库数据存放在数据文件中: 3. 从逻辑上讲,数据库是存放在表空间中,表空间由一个或者多个数据文件组成. 2.oracle的 ...
- JAVAEE——Lucene基础:什么是全文检索、Lucene实现全文检索的流程、配置开发环境、索引库创建与管理
1. 学习计划 第一天:Lucene的基础知识 1.案例分析:什么是全文检索,如何实现全文检索 2.Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3.配置开发环境 4.创建索引库 5 ...
- Oracle 分区表的索引、分区索引
对于分区表,可以建立不分区索引.也就是说表分区,但是索引不分区.以下着重介绍分区表的分区索引. 索引与表一样,也可以分区.索引分为两类:locally partition index(局部分区索引). ...
- Oracle 分区表中索引失效
当对分区表进行 一些操作时,会造成索引失效. 当有truncate/drop/exchange 操作分区 时全局索引 会失效. exchange 的临时表没有索引,或者有索引,没有用includin ...
- 记一次Oracle分区表全局索引重建的过程
1.查询数据库各个表空间利用率: SELECT Upper(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)&q ...
- oracle视图和索引
视图和索引 视图 视图的作用 控制数据访问.简化查询.避免重复访问相同的数据 视图的优点 限制用户只能通过视图检索数据,用户看不到底层基表 注意事项 视图可以理解为临时表,会随着真实表的数据变化而自动 ...
- 深入学习Oracle分区表及分区索引
关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: • Range(范围)分区 • Has ...
随机推荐
- 想要远程服务器长时间挂机不断开ssh连接的技巧
使用top命令挂着就好了,top命令执行的“查看系统进程和资源占用”的任务会一直输出动态的数据,一直有数据传输就不会因为长时间挂机而断开ssh链接了,尤其针对于海外服务器,因为高延迟经常出现挂机久了自 ...
- jmeter3.1 压测
压测目标:error 为0,线程起到250,服务器配置达到最大 一.Jmeter3.1 压测 JMeter3.1提供一个用于生成HTML页面格式图形化报告的扩展模块.该模块支持通过两种方式生成多维度图 ...
- eas之控制kdtable滚动条
//滚动条支持三种状态 自动 隐藏 显示 public static final int SCROLL_STATE_AUTO=0://自动根据数据判断是否显示或隐藏 public static fin ...
- android的数据与访问(1)-我的app配置参数文件放在哪儿?
系统提供数据处理方式: 1.SharedPreferences 2.文件存储 3.轻量级的数据.如SQLLite 1.简单存储 是android提供的起来年纪的数据存储方式:SharedPerence ...
- 2-SAT·hihoCoder音乐节
2-SAT·hihoCoder音乐节 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 hihoCoder音乐节由hihoCoder赞助商大力主办,邀请了众多嘉宾和知名乐队 ...
- vs code--使用教程
这是Cnode论坛上的i5ting写的,很详细 教程地址 这个是微软官方的英文版的教程,这个更详细一些 微软官方vs code教程
- Mycat连接数据库之后导致表名全小写的问题分析研究
初步研究:通过部署发现在Mycat中部署逻辑表表名大小写混合时,在Mycat连接后出现全变小.容易造成错误逻辑表(按混合表名创建物理表): 可能拯救的方法: 1.Linux下部署安装MySQL,默认不 ...
- MySQL Workbench出现:Error Code: 2013. Lost connection to MySQL server during query的问题解决
解决办法: [Edit]->[Preference]->[SQL Editor] 将下图DBMS connection read time out (in seconds)适当调大: 参考 ...
- HDU 4518
整理一下思路,明天再写... 这道题,其实就是求包含大于10的斐波那切数字的第K(K是斐波那契数)个数.注意到斐波那契数的爆炸性增长,所以在范围 内的符合要求的F数并不多吧.比如求第K个F数,那么,前 ...
- HDU 1466
经典DP,这样的递推确实有点难. 把所有直线分成两组,可以知道 m条直线的交点方案数 =(m-r)条平行线与r条直线交叉的交点数 + r条直线本身的交点方案 亦就是 =(m-r)*r+r条之间本身 ...