问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

oracle分区表怎么创建索引

发布网友 发布时间:2022-04-29 20:25

我来回答

2个回答

懂视网 时间:2022-04-30 00:46

今天用到了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分区表和索引的创建与管理

标签:

热心网友 时间:2022-04-29 21:54

方法如下:
Oracle中建立索引,会提高查询速度: create index 索引名 on 表名(列名);
例如:
create index index_userid on tbl_detail(userid);
如何找数据库表的主键字段的名称?
SELECT * FROM user_constraints WHERE CONSTRAINT_TYPE='P' and table_name='AAA'; select * from dba_cons_columns where CONSTRAINT_NAME='SYS_AAA';
Oracle 在创建主键(可以不加constraint SYS_AAA),会为库表自动创建索引,
索引的列为主键列。 并且当库表某些列名或者库表名改变时候,
Oracle自动创建的索引SYS_AAA,中的索引列也会自动更新(类似于视图),并且SYS_AAA会与名字更改后的库表还是保持索引关系。 关键系统库表: desc dba_constraints desc dba_cons_columns
desc dba_indexes desc dba_ind_columns desc DBA_TAB_COLUMNS
例子1:更改库表的列名
ALTER TABLE AAA RENAME COLUMN ID TO AAA_ID; create table AAA ( ID NUMBER(8), NAME CHAR(20),
constraint SYS_AAA primary key(ID) );
//查找约束名字
select c.CONSTRAINT_NAME,c.table_name,cc.COLUMN_NAME from user_constraints c, user_cons_columns cc
where c.constraint_name=cc.constraint_name and c.table_name ='AAA' AND C.CONSTRAINT_TYPE='P';
CONSTRAINT_NAME TABLE_NAME COLUMN_NAME
SYS_AAA AAA ID
//查找索引
select index_name,index_type,uniqueness from user_indexes where table_name='AAA'; INDEX_NAME INDEX_TYPE UNIQUENES
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 股市分析云南铜业?云南铜业千股千评价?云南铜业股票涨不动? 云南铜业现在可买入吗?云南铜业最近半年股价?云南铜业千股千评专家? 云南铜业现在可以买入不?云南铜业最新股价市盈率?云南铜业(000878)千股千评? 601600,股票停牌到什么时候 云南铜业股票2021估值高吗?云南铜业今日股价代码?云南铜业股吧千股千评? 最近那支股票的涨势比较好? 东轻集团股票现在多少钱 中铝国际股东为什么减持?中铝国际2021年年报发布时间?中铝国际千股千评证券之星? 百度视频明明是优酷的,为何在优酷网上找不到?该如何下载 笔记本电脑关机充电可不可以放在电脑包里充? 我是笔记本电脑新手,请教各位~ 笔记本可以放在电脑包里充电吗? 什么牌子的笔记本电脑包好? 谁能给我推荐一款充电宝啊,给笔记本电脑充电的 黑色口罩为什么不能带 黑色的口罩开封了会不会怎么样? 戴黑色口罩的女人给人感觉怎么样!? 新西兰葡萄酒酿造专业就业前景怎么样 中国农业大学葡萄与葡萄酒工程专业发展前景 葡萄与葡萄酒工程专业? 2011年7月主力建仓个股有哪几支 云南铜业的股票为什么涨的慢?云南铜业2021年报?云南铜业每日千股千评? 云南铜业的市盈率为什么那么高?云南铜业2021年报预测?云南铜业千股千评 证券之星? 云南铜业现在经营状况?云南铜业长期投资股价?千股千评云南铜业000878? 云南铜业现在能抄底吗?云南铜业最新股价是多少?000878云南铜业千股千评? 云南铜业半年报预告?云南铜业今日股市?股云南铜业千股千评? 最近想买股票,但是自己又不会买,有没有高手教一下,或者直接推荐,我想中长期持有! 懂股票的专家来帮帮我。。小女子有困惑!! 房贷按揭130万20年每月需付多少 打算买130万的房子,住房公积金贷款80万,商业贷款50万,都是30年,月供多少?二十年呢? 电视剧《山河令》超前点播,你会付费观看吗? 如何做柠檬冰糖雪梨汁 我有公积金,买房三十三万五,贷款二十万,贷二十年,月供是多少? 公积金贷款13万20年请问月供是多少? 宠物托运需要什么 73万住房公积金贷款20年,月供费用多少?总利息是多少? 宠物可以托运吗需要办理什么东西? 国产96式坦克击毁俄T72,如何看96式 96坦克的柴油机是国产的吗 托运宠物需要准备什么