如何管理oracle 的分区表和索引(续

如何管理oracle 的分区表和索引(续,第1张

一、创建分区

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) --优秀)创建完分区表后向表中添加一些数据:declarename varchar2(10);

fraction number(5);

grade number(5);

i number(8):=1;

begin

for i in 1100000 LOOP

SELECT CHR (ROUND (DBMS_RANDOMVALUE (97, 122))) INTO NAME FROM DUAL;SELECT ABS(MOD(DBMS_RANDOMRANDOM,101)) into fraction FROM DUAL;SELECT ABS(MOD(DBMS_RANDOMRANDOM,10))+1 into grade FROM DUAL;insert into range_fraction values(seq_range_fractionnextval ,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,

1

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这个非分区表中。

(一) 索引类似字典以及书籍的目录,索引的作用就是加快检索数据的速度,提高效率,

索引分类为:

逻辑上:

Single column 单列索引

Concatenated 多列索引

Unique 唯一索引

NonUnique 非唯一索引

Function-based函数索引

Domain 域索引

物理上:

Partitioned 分区索引

NonPartitioned 非分区索引

B-tree:

Normal 正常型B树

Rever Key 反转型B树

Bitmap 位图索引

(二) 聚集索引和非聚集索引有什么区别?

例如由于字典是按照拼音的顺序来实际存储的,因此对拼音的索引是聚集索引,

也可以建立对笔画等的索引,由于实际存储并不是按照笔画的顺序来存储的,

因此对笔画的索引是非聚集索引,

(三)简述分区表和分区索引的优点:应该是利用不同的分区可以使得检索数据并行,进一步提高速度。

局部索引local index \r\n1 局部索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区说,一句话,局部索引的分区机制和表的分区机制一样。 \r\n2 如果局部索引的索引列以分区键开头,则称为前缀局部索引。 \r\n3 如果局部索引的列不是以分区键开头,或者不包含分区键列,则称为非前缀索引。 \r\n4 前缀和非前缀索引都可以支持索引分区消除,前提是查询的条件中包含索引分区键。 \r\n5 局部索引只支持分区内的唯一性,无法支持表上的唯一性,因此如果要用局部索引去给表做唯一性约束,则约束中必须要包括分区键列。 \r\n6 局部分区索引是对单个分区的,每个分区索引只指向一个表分区,全局索引则不然,一个分区索引能指向n个表分区,同时,一个表分区,也可能指向n个索引分区, \r\n对分区表中的某个分区做truncate或者move,shrink等,可能会影响到n个全局索引分区,正因为这点,局部分区索引具有更高的可用性。 \r\n7 位图索引只能为局部分区索引。 \r\n8 局部索引多应用于数据仓库环境中。 \r\n\r\n全局索引global index \r\n1 全局索引的分区键和分区数和表的分区键和分区数可能都不相同,表和全局索引的分区机制不一样。 \r\n2 全局索引可以分区,也可以是不分区索引,全局索引必须是前缀索引,即全局索引的索引列必须是以索引分区键作为其前几列。 \r\n3 全局分区索引的索引条目可能指向若干个分区,因此,对于全局分区索引,即使只动,截断一个分区中的数据,都需要rebulid若干个分区甚 \r\n至是整个索引。 \r\n4 全局索引多应用于oltp系统中。 \r\n5 全局分区索引只按范围或者散列hash分区,hash分区是10g以后才支持。 \r\n6 oracle9i以后对分区表做move或者truncate的时可以用update global indexes语句来同步更新全局分区索引,用消耗一定资源来换取高度的可用性。 \r\n7 表用a列作分区,索引用b做局部分区索引,若where条件中用b来查询,那么oracle会扫描所有的表和索引的分区,成本会比分区更高,此时可以考虑用b做全局分区索引

以上就是关于如何管理oracle 的分区表和索引(续全部的内容,包括:如何管理oracle 的分区表和索引(续、数据库的索引问题、局部分区索引 在分区表上建立索引A 那么每个分区的索引A1 A2 和建立的索引A都是什么索引等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9756115.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存