ORACLE分区表、分区索引

合集下载

Oracle 分区的概念

Oracle  分区的概念

Oracle 分区的概念分区是指将巨型的表或索引分割成相对较小的、可独立管理的部分,这些独立的部分称为原来表或索引的分区。

分区后的表与未分区的表在执行查询语句或其他DML语句时没有任何区别,一旦进行分区之后,还可以使用DDL语句对每个单独的分区进行操作。

因此,对巨型表或者索引进行分区后,能够简化对它们的管理和维护操作,而且分区对于最终用户和应用程序是完全透明的。

在对表进行分区后,每一个分区都具有相同的逻辑属性。

例如,各个分区都具有相同的字段名、数据类型和约束等。

但是各个分区的物理属性可以不同,例如,各个分区可以具有不同的存储参数,或者位于不同的表空间中。

如果对表进行了分区,表中的每一条记录都必须明确地属于某一个分区。

记录应当属于哪一个分区是记录中分区字段的值决定的。

分区字段可以是表中的一个字段或多个字段的组合,这时在在创建分区表时确定。

在对分区表执行插入、删除或更新等操作时,Oracle会自动根据分区字段的值来选择所操用的分区。

分区字段由1~16个字段以某种顺序组成,但不能包含ROWID等伪列,也不能包含全为NULL值的字段。

图10-1显示了一个典型的分区表。

通常在对表进行分区时也会将地对应的索引进行分区,但是未分区的表可以具有分区的索引,而分区的表也可以具有未分区的索引。

索引索引索引索引5月6月7月未分区的表(分区的索引)分区的表(分区的索引)图10-1 分区表与分区索引一个表可以被分割成任意数目的分区,但如果在表中包含有LONG或LONG RAW类型的字段,则不能对表分区。

对于索引组织表而言,虽然也可以分区,但是有如下一些限制:●索引组织表仅支持范围和散列分区,不能以列表或复合方式对索引组织表进行分区。

●分区字段必须是主键字段的一个子集。

●如果在索引组织表中使用了OVERFLOW子句,溢出存储段将随表的分区进行相同的分割。

下面给出了应当考虑对表进行分区的一些常见情况:●如果一个表的大小超过了2GB,通常会对它进行分区。

Oracle-创建索引分区

Oracle-创建索引分区

Oracle-创建索引分区对⼤数据量索引进⾏分区同样能够优化应⽤系统的性能。

⼀般来说,如果索引所对应的表的数据量⾮常⼤,⽐如⼏百万甚⾄上千万条数据,则索引也会占⽤很⼤的空间,这时,建议对索引进⾏分区。

Oracle索引分区分为本地索引分区和全局索引分区两种:全局索引不反映基础表的结构,因此,若要分区就只能进⾏范围分区;⽽局部索引反映基础表的结构。

本地索引分区 本地索引分区就是使⽤和分区表同样的分区键进⾏分区的索引,也就是说,索引分区所采⽤的列与该表的分区所采⽤的列是相同的,本地索引有以下优点:如果只有⼀个分区需要维护,则只有⼀个本地索引受影响⽀持分区独⽴性只有本地索引能够⽀持单⼀分区的装⼊和卸载表分区和各⾃的本地索引可以同时恢复本地索引可以单独重复位图索引仅由本地索引⽀持如:创建⼀个表分区,然后根据这个表分区创建本地索引区1.⾸先创建3个表空间,分别存放到3不同磁盘分区中,分别为ts_1,ts_2,ts_32.创建⼀个存储学⽣成绩的分区表studentgrade,该表共有3个分区,分别位于表空间 ts_1,ts_2,ts_3create table studentgrade(id number primary key,name varchar2(10),subject varchar2(10),grade number)partition by range(grade)(partition par_nopass values less than(60) tablespace ts_1,partition par_pass values less than(70) tablespace ts_2,partition par_good values less than(maxvalue) tablespace ts_3)/3.根据表分区创建本地索引分区,与表分区⼀样,索引分区也是3个分区(p1,p2,p3)create index grade_index on studentgrade(grade)local(partition p1 tablespace ts_1,partition p2 tablespace ts_2,partition p3 tablespace ts_3)/4.最后,⽤户可以通过查询dba_ind_partitions视图来查看索引分区信息select partition_name,tablespace_name from dba_ind_partitions where index_name='GRADE_INDEX';全局索引区 全局索引就是没有与分区表相同分区键的分区索引。

oracle重建分区索引语句

oracle重建分区索引语句

oracle重建分区索引语句摘要:1.Oracle 分区索引简介2.重建分区索引的原因3.重建分区索引的步骤4.示例:使用SQL 语句重建分区索引正文:一、Oracle 分区索引简介Oracle 分区索引是一种在分区表上的索引,它可以提高查询效率。

分区索引与普通索引类似,但它是基于分区表的,因此具有更高的查询性能。

当数据量较大时,分区索引能够有效地减少查询数据的范围,提高查询速度。

二、重建分区索引的原因重建分区索引通常有以下原因:1.索引损坏:当分区索引损坏时,需要进行重建。

2.数据表分区改变:当数据表的分区发生变化时,需要重建分区索引以适应新的分区结构。

3.优化查询性能:在某些情况下,重建分区索引可以提高查询性能。

三、重建分区索引的步骤1.备份数据:在进行分区索引重建之前,需要备份数据以防止数据丢失。

2.使用ALTER INDEX 命令:使用ALTER INDEX 命令可以重建分区索引。

需要指定要重建的索引名称以及分区信息。

3.检查重建结果:重建完成后,需要检查重建结果以确保索引正确无误。

四、示例:使用SQL 语句重建分区索引以下是一个使用SQL 语句重建分区索引的示例:```sqlALTER INDEX index_nameREBUILD PARTITION p_number;```其中,`index_name`是要重建的分区索引名称,`p_number`是要重建的分区编号。

可以根据实际情况修改相应的参数值。

通过以上步骤和示例,可以完成Oracle 分区索引的重建工作。

在进行分区索引重建时,需要谨慎操作,确保数据安全。

Oracle分区表详细讲解

Oracle分区表详细讲解

简写:
CREATE TABLE emp ( empno NUMBER (4), ename VARCHAR2 (30), sal NUMBER ) PARTITION BY HASH (empno) PARTITIONS 8 STORE IN (emp1,emp2,emp3,emp4,emp5,emp 6,emp7,emp8);
) PARTITION BY RANGE (grade) (
PARTITION part1 VALUES LESS THEN (1000) TABLESPACE Part1_tb,
PARTITION part2 VALUES LESS THEN (MAXV ALUE) TABLESPACE Part2_tb );
范围分区的特点
• 最早、最经典的分区方法 • Range分区通过对分区字段值的范围进行分区 • Range分区特别适合于按时间周期进行数据的存储:日、周、月、年
等 • 数据管理能力强
– 数据迁移 – 数据备份 – 数据交换 • 范围分区的数据可能不均匀 • 范围分区与记录值有关,实施难度和可维护性相对较差
PARTITION BY LIST(sales_state) (
PARTITION sales_west VALUES('California', 'Hawaii'), PARTITION sales_east VALUES ('New York', 'Virginia', 'Florida'), PARTITION sales_central VALUES('Texas', 'Illinois'), PARTITION sales_other VALUES(DEFAULT));

oracle大表改造分区表的步骤

oracle大表改造分区表的步骤

oracle大表改造分区表的步骤将Oracle大表改造为分区表的步骤如下:1. 数据预处理:首先,对大表进行数据分析,确定适合的分区列(分区键),例如日期、地域等。

然后,对数据进行预处理,确保数据符合分区键要求,如格式统一、排序等。

2. 创建分区表:使用CREATE TABLE语句创建分区表,指定分区键和分区策略。

分区策略可以是范围分区、列表分区或哈希分区等。

同时,也可以定义分区索引和本地分区索引。

3. 迁移数据:将大表中的数据迁移到分区表中,可以使用INSERT INTO SELECT语句或者数据泵工具(如expdp和impdp命令)进行数据迁移。

确保迁移的数据符合分区键和分区策略要求。

4. 索引重建:根据分区表的分区信息,重新创建分区索引和本地分区索引。

可以使用ALTER TABLE语句添加分区索引,也可以使用CREATE INDEX语句重新创建索引。

5. 测试验证:对分区表进行测试和验证,包括数据查询、插入、更新和删除等操作,确保分区表的性能和功能正常。

6. 调优优化:根据实际需求和性能要求,进行分区表的调优和优化。

可以使用Oracle提供的分区相关功能,如局部分区索引、分区裁剪、分区交换等,以提升查询和维护效率。

7. 应用升级:在应用层面进行相应的升级,确保应用程序能够正确地操作和利用分区表,如修改SQL语句、更新存储过程等。

8. 监控维护:在生产环境中,对分区表进行监控和维护,包括定期备份、压缩分区、重新构建索引等,以保证分区表的稳定性和性能。

总结:将Oracle大表改造为分区表的步骤主要包括数据预处理、创建分区表、迁移数据、索引重建、测试验证、调优优化、应用升级和监控维护等。

这些步骤可以根据实际情况进行调整和扩展,以满足具体的业务需求和性能要求。

Oracle表分区的分类及实例

Oracle表分区的分类及实例

Oracle表分区的分类及实例Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。

通常,分区可以使某些查询以及维护操作的性能大大提高。

此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。

分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。

每个分区有自己的名称,还可以选择自己的存储特性。

从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。

但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用 SQL DML 命令访问分区后的表时,无需任何修改。

比较能理解的是以下几个几种表分区:1 范围分区每个分区都由一个分区键值范围指定create table RangeTable(id int primary key,name varchar(10),grade int)partition by rang(grade)(partition part1 values less then(1000) tablespace Part1_tb,--将grade的值小于1000的记录放在part1分区里partition part2 values less then(MAXVALUE) tablespace Part2_tb);2 列表分区create table ListTable(id int primary key,name varchar(20),area varchar(10))partition by list(area)(partition part1 values('guangdong','beijing') tablespace Part1_tb, partition part2 values('shanghai','nanjing') tablespace Part2_tb );3 散列分区create table HashTable(id int primary key,name varchar(20),grade int)partition by hash(grade)partitions 10store in(Part1_tb,Part2_tb,Part3_tb)partition by rang(grade)(partition part1 tablespace Part1_tb,partition part2 tablespace Part2_tb);4 索引分区create index IndexTable_indexon IndexTable(name)local(partition part1 tablespace Part1_tb,partition part2 tablespace Part2_tb)--local 告诉oracle表 IndexTable的每一个分区建立一个独立的索引create index IndexTable_indexon IndexTable(name)global;--global为全局索引全局索引可以包含多个分区的值局部索引比全局索引容易管理,而全局索引比较快注意:不能为散列分区或者子分区创建全局索引。

Oracle 分区索引和全局索引

Oracle  分区索引和全局索引

Oracle 分区索引和全局索引对于分区表而言,每个表分区对应一个分区段。

当在分区表上建立索引时,即可以建立全局索引,也可以建立分区索引。

对于合局索引,其索引数据会存放在一个索引段中;而对于分区索引,则索引数据都会被存放到几个索引分区段中。

对索引进行分区的目的与对表进行分区是一样的,都是为了更加易于管理和维护巨型对象。

在Oracle中,一共可以为分区表建立三种类型的索引,下面分别介绍它们的特点和适用情况。

1.本地分区索引本地分区索引是为分区表中的各个分区单独地建立分区,各个索引分区之间是相互独立的。

本地分区索引相对比较简单,也比较容易管理。

图10-4显示了本地分区索引和分区表之间的对应关系:分区索引分区表图10-4 本地分区索引与分区表在为分区表创建本地索引后,Oracle会自动对表的分区和索引的分区进行同步处理。

如果为分区表添加新的分区后,Oracle会自动为新分区建立新的索引。

与此相反,如果表的分区依然存在,则用户将不能删除它所对应用的索引分区。

在删除表的分区时,系统会自动删除所对应的索引分区。

例如,下面的语句为范围分区表SALES_RANGE创建本地分区索引:SQL> create index sales_local_idx2 on sales_range(customer_id) local;索引已创建。

2.全局分区索引全局分区索引是对整个分区表建立的索引,然后再由Oracle对索引进行分区。

全局分区索引的各个分区之间不是相互独立的,索引分区与分区表之间也不是简单的一对一关系。

图10-5显示了全局分区索引与分区表的对应关系。

分区索引分区表图10-5 全局分区索引与分区表例如,下面的语句为分区表SALES_LIST创建全局分区索引:SQL> create index sales_global_part_idx2 on sales_list(customer_id)3 global partition by range(customer_id)4 (5 partition part1 values less than(300) tablespace space01,6 partition part2 values less than(maxvalue) tablespace space027 );索引已创建。

Oracle分区表删除分区引发错误ORA-01502:索引或这类索引的分区处于不可用状态

Oracle分区表删除分区引发错误ORA-01502:索引或这类索引的分区处于不可用状态

Oracle分区表删除分区引发错误ORA-01502:索引或这类索引的分区处于不可⽤状态(⼀)问题:最近在做Oracle数据清理,在对分区表进⾏数据清理时,采⽤的⽅法是drop partition,删除的过程中,没有遇到任何问题,⼤概过了10分钟,开发⼈员反馈部分分区表上的业务失败。

具体错误为:ORA-01502错误:索引或这类索引的分区处于不可⽤状态(英⽂:ora-01502:index 'schema.index_name' or partition of such index is in unusable state)。

(⼆)原因分析查看出现问题的分区表,均有⼀个共同点:表上以“pk_”开头的索引为unusable状态,以“pk_”开头的索引是随创建主键约束⽽创建的。

当⽤户在创建主键约束或唯⼀性约束的时候,会在相应的列上创建唯⼀性索引经过查证,发现是在删除分区的时候,导致分区表上的唯⼀性全局索引为不可⽤状态,导致新的数据⽆法正常插⼊,从⽽引发了该错误。

是不是索引不可⽤会导致DML操作失败呢?经过验证,发现以下特点:1.对于⾮唯⼀性索引,如果索引不可⽤,是不会影响到到DML操作的;2.对于唯⼀性索引,如果索引不可⽤,在进⾏DML操作时,会触发ORA-01502错误;这⾥记录⼀下哪些操作会导致索引失效:图1.索引失效原因总结(三)解决⽅案(3.1)了解唯⼀性索引在解决问题之前,我们来分析⼀下,哪些⾏为会创建唯⼀性索引(3种):--直接创建唯⼀性索引。

语法为:CREATE UNIQUE INDEX index_name on table_name(col1,col2,…);--创建主键约束时⾃动创建唯⼀性索引。

语法为:ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY(col1,col2,..);--创建唯⼀性约束时⾃动创建唯⼀性索引。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

深入学习Oracle分区表及分区索引关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类:•Range(范围)分区•Hash(哈希)分区•List(列表)分区•以及组合分区:Range-Hash,Range-List。

对于表而言(常规意义上的堆组织表),上述分区形式都可以应用(甚至可以对某个分区指定compress属性),只不过分区依赖列不能是lob,long之类数据类型,每个表的分区或子分区数的总数不能超过1023个。

对于索引组织表,只能够支持普通分区方式,不支持组合分区,常规表的限制对于索引组织表同样有效,除此之外呢,还有一些其实的限制,比如要求索引组织表的分区依赖列必须是主键才可以等。

注:本篇所有示例仅针对常规表,即堆组织表!对于索引,需要区分创建的是全局索引,或本地索引:l 全局索引(global index):即可以分区,也可以不分区。

即可以建range分区,也可以建hash分区,即可建于分区表,又可创建于非分区表上,就是说,全局索引是完全独立的,因此它也需要我们更多的维护操作。

l 本地索引(local index):其分区形式与表的分区完全相同,依赖列相同,存储属性也相同。

对于本地索引,其索引分区的维护自动进行,就是说你add/drop/split/truncate表的分区时,本地索引会自动维护其索引分区。

Oracle建议如果单个表超过2G就最好对其进行分区,对于大表创建分区的好处是显而易见的,这里不多论述why,而将重点放在when以及how。

ORACLE对于分区表方式其实就是将表分段存储,一般普通表格是一个段存储,而分区表会分成多个段,所以查找数据过程都是先定位根据查询条件定位分区范围,即数据在那个分区或那几个内部,然后在分区内部去查找数据,一个分区一般保证四十多万条数据就比较正常了,但是分区表并非乱建立,而其维护性也相对较为复杂一点,而索引的创建也是有点讲究的,这些以下尽量阐述详细即可。

range分区方式,也算是最常用的分区方式,其通过某字段或几个字段的组合的值,从小到大,按照指定的范围说明进行分区,我们在INSERT数据的时候就会存储到指定的分区中。

List分区方式,一般是在range基础上做的二级分区较多,是一种列举方式进行分区,一般讲某些地区、状态或指定规则的编码等进行划分。

Hash分区方式,它没有固定的规则,由ORACLE管理,只需要将值INSERT进去,ORACLE 会自动去根据一套HASH算法去划分分区,只需要告诉ORACLE要分几个区即可。

WHEN一、When使用Range分区Range分区呢是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中,比如按照时间划分,2008年1季度的数据放到a分区,08年2季度的数据放到b分区,因此在创建的时候呢,需要你指定基于的列,以及分区的范围值,如果某些记录暂无法预测范围,可以创建maxvalue分区,所有不在指定范围内的记录都会被存储到maxvalue所在分区中,并且支持指定多列做为依赖列,后面在讲how的时候会详细谈到。

二、When使用Hash分区通常呢,对于那些无法有效划分范围的表,可以使用hash分区,这样对于提高性能还是会有一定的帮助。

hash分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的hash值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash分区也可以支持多个依赖列。

三、When使用List分区List分区与range分区和hash分区都有类似之处,该分区与range分区类似的是也需要你指定列的值,但这又不同与range分区的范围式列值---其分区值必须明确指定,也不同与hash分区---通过明确指定分区值,你能控制记录存储在哪个分区。

它的分区列只能有一个,而不能像range或者hash分区那样同时指定多个列做为分区依赖列,不过呢,它的单个分区对应值可以是多个。

你在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,类似range分区中的maxvalue分区。

四、When使用组合分区如果某表按照某列分区之后,仍然较大,或者是一些其它的需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。

组合分区呢在10g中有两种:range-hash,range-list。

注意顺序哟,根分区只能是range 分区,子分区可以是hash分区或list分区。

提示:11g在组合分区功能这块有所增强,又推出了range-range,list-range,list-list,list-hash,这就相当于除hash外三种分区方式的笛卡尔形式都有了。

为什么会没有hash做为根分区的组合分区形式呢,再仔细回味一下第二点,你一定能够想明白~~。

深入学习Oracle分区表及分区索引(2)一、如何创建如果想对某个表做分区,必须在创建表时就指定分区,我们可以对一个包含分区的表中的分区做修改,但不能直接将一个未分区的表修改成分区表(起码在10g是不行的,当然你可能会说,可以通过在线重定义的方式,但是这不是直接哟,这也是借助临时表间接实现的)。

创建表或索引的语法就不说了,大家肯定比我还熟悉,而想在建表(索引)同时指定分区也非常容易,只需要把创建分区的子句放到";"前就行啦,同时需要注意表的row movement 属性,它用来控制是否允许修改列值所造成的记录移动至其它分区存储,有enable|disable 两种状态,默认是disable row movement,当disable时,如果记录要被更新至其它分区,则更新语句会报错。

下面分别演示不同分区方式的表和索引的创建:1、创建range分区语法如下,需要我们指定的有:l column:分区依赖列(如果是多个,以逗号分隔);l partition:分区名称;l values less than:后跟分区范围值(如果依赖列有多个,范围对应值也应是多个,中间以逗号分隔);l tablespace_clause:分区的存储属性,例如所在表空间等属性(可为空),默认继承基表所在表空间的属性。

①创建一个标准的range分区表:JSSWEB> create table t_partition_range (id number,name varchar2(50))partition by range(id)(partition t_range_p1 values less than (10) tablespace tbspart01,partition t_range_p2 values less than (20) tablespace tbspart02,partition t_range_p3 values less than (30) tablespace tbspart03,partition t_range_pmax values less than (maxvalue) tablespace tbspart04);表已创建。

要查询创建分区的信息,可以通过查询user_part_tables,user_tab_partitions两个数据字典(索引分区、组织分区等信息也有对应的数据字典,后续示例会逐步提及)。

user_part_tables:记录分区的表的信息;user_tab_partitions:记录表的分区的信息。

例如:JSSWEB> select table_name,partitioning_type,partition_countFrom user_part_tables where table_name='T_PARTITION_RANGE';JSSWEB> select partition_name,high_value,tablespace_namefrom user_tab_partitions where table_name='T_PARTITION_RANGE'order by partition_position;②创建global索引range分区:JSSWEB> create index idx_parti_range_id on t_partition_range(id)2 global partition by range(id)(3 partition i_range_p1 values less than (10) tablespace tbspart01,4 partition i_range_p2 values less than (40) tablespace tbspart02,5 partition i_range_pmax values less than (maxvalue) tablespace tbspart03);索引已创建。

由上例可以看出,创建global索引的分区与创建表的分区语句格式完全相同,而且其分区形式与索引所在表的分区形式没有关联关系。

注意:我们这里借助上面的表t_partition_range来演示创建range分区的global索引,并不表示range分区的表,只能创建range分区的global索引,只要你想,也可以为其创建hash分区的global索引。

查询索引的分区信息可以通过user_part_indexes、user_ind_partitions两个数据字典:JSSWEB> select index_name, partitioning_type, partition_count2 From user_part_indexes3 where index_name = 'IDX_PARTI_RANGE_ID';③Local分区索引的创建最简单,例如:仍然借助t_partition_range表来创建索引--首先删除之前创建的global索引JSSWEB> drop index IDX_PARTI_RANGE_ID;索引已删除。

JSSWEB> create index IDX_PARTI_RANGE_ID on T_PARTITION_RANGE(id) local;索引已创建。

查询相关数据字典:JSSWEB> select index_name, partitioning_type, partition_count2 From user_part_indexes3 where index_name = 'IDX_PARTI_RANGE_ID';JSSWEB> select partition_name, high_value, tablespace_name2 from user_ind_partitions3 where index_name = 'IDX_PARTI_RANGE_ID'4 order by partition_position;可以看出,local索引的分区完全继承表的分区的属性,包括分区类型,分区的范围值即不需指定也不能更改,这就是前面说的:local索引的分区维护完全依赖于其索引所在表。

相关文档
最新文档