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索引分区分为本地索引分区和全局索引分区两种:全局索引不反映基础表的结构,因此,若要分区就只能进⾏范围分区;⽽局部索引反映基础表的结构。
本地索引分区 本地索引分区就是使⽤和分区表同样的分区键进⾏分区的索引,也就是说,索引分区所采⽤的列与该表的分区所采⽤的列是相同的,本地索引有以下优点:如果只有⼀个分区需要维护,则只有⼀个本地索引受影响⽀持分区独⽴性只有本地索引能够⽀持单⼀分区的装⼊和卸载表分区和各⾃的本地索引可以同时恢复本地索引可以单独重复位图索引仅由本地索引⽀持如:创建⼀个表分区,然后根据这个表分区创建本地索引区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分区表详细讲解

简写:
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的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。
通常,分区可以使某些查询以及维护操作的性能大大提高。
此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。
分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。
每个分区有自己的名称,还可以选择自己的存储特性。
从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。
但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用 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中,一共可以为分区表建立三种类型的索引,下面分别介绍它们的特点和适用情况。
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数据清理,在对分区表进⾏数据清理时,采⽤的⽅法是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,..);--创建唯⼀性约束时⾃动创建唯⼀性索引。
oracle重建分区索引语句

oracle重建分区索引语句【原创实用版】目录1.Oracle 分区索引简介2.重建分区索引的原因3.重建分区索引的步骤4.示例:使用 SQL 语句重建分区索引5.注意事项正文1.Oracle 分区索引简介Oracle 分区索引是一种特殊类型的索引,它可以提高查询效率,特别是在涉及大量数据的查询中。
分区索引将表的数据划分为多个区域,每个区域都有一个独立的索引。
这样可以避免在查询时扫描整个表,从而提高查询速度。
2.重建分区索引的原因重建分区索引通常出于以下原因:- 索引损坏:当分区索引损坏时,需要重建索引以恢复查询效率。
- 数据表调整:当数据表的结构发生变化,如增加或删除分区时,需要重建分区索引以适应新的结构。
- 优化查询性能:当查询性能下降时,可能需要重建分区索引以提高查询效率。
3.重建分区索引的步骤重建分区索引的步骤如下:1) 备份数据表和索引,以防止重建过程中出现错误。
2) 使用 ALTER INDEX 命令重建分区索引。
具体语法如下:```ALTER INDEX index_nameREBUILD PARTITION p_number;```其中,`index_name`是要重建的分区索引的名称,`p_number`是要重建的分区号。
3) 如果需要,可以重建多个分区的索引。
只需在命令中指定多个分区号,如下所示:```ALTER INDEX index_nameREBUILD PARTITION p_number, p_number;```4.示例:使用 SQL 语句重建分区索引假设有一个名为`my_table`的数据表,它有一个名为`my_index`的分区索引。
现在需要重建该索引的第二个分区,可以使用以下 SQL 语句:```sqlALTER INDEX my_indexREBUILD PARTITION 2;```5.注意事项- 在重建分区索引时,应确保有足够的系统资源,以避免影响其他数据库操作。
oracle创建分区表语法

oracle创建分区表语法在Oracle中,分区表是一个物理数据库对象,它允许您将一个大表的数据分割成较小的、更易于管理的片段,称为分区。
每个分区可以在不同的表空间中存储,并且可以独立地备份和恢复。
这可以提高查询性能,备份和恢复的效率,以及管理大量数据的便利性。
创建分区表的语法如下:```sqlCREATE TABLE table_name (column1 datatype1,column2 datatype2,...)PARTITION BY partition_method (partition_name1 value_column1 value_range,partition_name2 value_column2 value_range,...);```这里是一些常见的分区方法:RANGE Partitioning:根据列的值范围对数据进行分区。
LIST Partitioning:根据列的离散值对数据进行分区。
HASH Partitioning:根据计算列的哈希值对数据进行分区。
KEY Partitioning:类似于 RANGE Partitioning,但使用索引的键值进行分区。
以下是一个创建RANGE分区表的例子:```sqlCREATE TABLE sales (order_id NUMBER,sale_date DATE,amount NUMBER)PARTITION BY RANGE (sale_date) (PARTITION p0 VALUES LESS THAN (TO_DATE('', 'YYYY-MM-DD')), PARTITION p1 VALUES LESS THAN (TO_DATE('', 'YYYY-MM-DD')),PARTITION p2 VALUES LESS THAN (MAXVALUE));```在这个例子中,`sales` 表根据 `sale_date` 列的值被分成了三个分区:p0、p1 和 p2。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分区表_分区索引_索引分区在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍了分区表的使用。
在大型的企业应用或企业级的数据库应用中,要处理的数据量通常可以达到几十到几百GB,有的甚至可以到TB级。
虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。
使用分区的优点:·增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;·维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;·均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能;·改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
Oracle数据库提供对表或索引的分区方法有三种:·范围分区·Hash分区(散列分区)·复合分区下面将以实例的方式分别对这三种分区方法来说明分区表的使用。
为了测试方便,我们先建三个表空间。
create tablespace dinya_space01datafile ’/test/demo/oracle/demodata/dinya01.dnf’ size 50Mcreate tablespace dinya_space01datafile ’/test/demo/oracle/demodata/dinya02.dnf’ size 50Mcreate tablespace dinya_space01datafile ’/test/demo/oracle/demodata/dinya03.dnf’ size 50M1.1. 分区表的创建1.1.1. 范围分区范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。
如根据序号分区,根据业务记录的创建日期进行分区等。
需求描述:有一个物料交易表,表名:material_transactions。
该表将来可能有千万级的数据记录数。
要求在建该表的时候使用分区表。
这时候我们可以使用序号分区三个区,每个区中预计存储三千万的数据,也可以使用日期分区,如每五年的数据存储在一个分区上。
根据交易记录的序号分区建表:SQL> create table dinya_test2 (3 transaction_id number primary key,4 item_id number(8) not null,5 item_description varchar2(300),6 transaction_date date not null7 )8 partition by range (transaction_id)9 (10 partition part_01 values less than(30000000) tablespace dinya_space01,11 partition part_02 values less than(60000000) tablespace dinya_space02,12 partition part_03 values less than(maxvalue) tablespace dinya_space0313 );Table created.建表成功,根据交易的序号,交易ID在三千万以下的记录将存储在第一个表空间dinya_space01中,分区名为:par_01,在三千万到六千万之间的记录存储在第二个表空间:dinya_space02中,分区名为:par_02,而交易ID在六千万以上的记录存储在第三个表空间dinya_space03中,分区名为par_03.根据交易日期分区建表:SQL> create table dinya_test2 (3 transaction_id number primary key,4 item_id number(8) not null,5 item_description varchar2(300),6 transaction_date date not null7 )8 partition by range (transaction_date)9 (10 partition part_01 values less than(to_date(’2006-01-01’,’yyyy-mm-dd’))tablespace dinya_space01,11 partition part_02 values less than(to_date(’2010-01-01’,’yyyy-mm-dd’))tablespace dinya_space02,12 partition part_03 values less than(maxvalue) tablespace dinya_space0313 );Table created.这样我们就分别建了以交易序号和交易日期来分区的分区表。
每次插入数据的时候,系统将根据指定的字段的值来自动将记录存储到制定的分区(表空间)中。
当然,我们还可以根据需求,使用两个字段的范围分布来分区,如partition by range ( transaction_id ,transaction_date), 分区条件中的值也做相应的改变,请读者自行测试。
1.1.2. Hash分区(散列分区)散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。
如将物料交易表的数据根据交易ID散列地存放在指定的三个表空间中:SQL> create table dinya_test2 (3 transaction_id number primary key,4 item_id number(8) not null,5 item_description varchar2(300),6 transaction_date date7 )8 partition by hash(transaction_id)9 (10 partition part_01 tablespace dinya_space01,11 partition part_02 tablespace dinya_space02,12 partition part_03 tablespace dinya_space0313 );Table created.建表成功,此时插入数据,系统将按transaction_id将记录散列地插入三个分区中,这里也就是三个不同的表空间中。
1.1.3. 复合分区有时候我们需要根据范围分区后,每个分区内的数据再散列地分布在几个表空间中,这样我们就要使用复合分区。
复合分区是先使用范围分区,然后在每个分区内再使用散列分区的一种分区方法,如将物料交易的记录按时间分区,然后每个分区中的数据分三个子分区,将数据散列地存储在三个指定的表空间中:SQL> create table dinya_test2 (3 transaction_id number primary key,4 item_id number(8) not null,5 item_description varchar2(300),6 transaction_date date7 )8 partition by range(transaction_date)subpartition by hash(transaction_id)9 subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)10 (11 parti tion part_01 values less than(to_date(’2006-01-01’,’yyyy-mm-dd’)),12 partition part_02 values less than(to_date(’2010-01-01’,’yyyy-mm-dd’)),13 partition part_03 values less than(maxvalue)14 );Table created.该例中,先是根据交易日期进行范围分区,然后根据交易的ID将记录散列地存储在三个表空间中。
1.2. 分区表操作以上了解了三种分区表的建表方法,下面将使用实际的数据并针对按日期的范围分区来测试分区表的数据记录的操作。
1.2.1. 插入记录:SQL> insert into dinya_test values(1,12,’BOOKS’,sysdate);1 row created.SQL> insert into dinya_test values(2,12, ’BOOKS’,sysdate+30);1 row created.SQL> insert into dinya_test values(3,12, ’BOOKS’,to_date(’2006-05-30’,’yyyy-mm-dd’));1 row created.SQL> insert into dinya_test values(4,12, ’BOOKS’,to_date(’2007-06-23’,’yyyy-mm-dd’));1 row created.SQL> insert into dinya_test val ues(5,12, ’BOOKS’,to_date(’2011-02-26’,’yyyy-mm-dd’));1 row created.SQL> insert into dinya_test values(6,12, ’BOOKS’,to_date(’2011-04-30’,’yyyy-mm-dd’));1 row created.SQL> commit;Commit complete.SQL>按上面的建表结果,2006年前的数据将存储在第一个分区part_01上,而2006年到2010年的交易数据将存储在第二个分区part_02上,2010年以后的记录存储在第三个分区part_03上。
1.2.2. 查询分区表记录:SQL> select * from dinya_test partition(part_01);TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE--------------------------------------------------------------------------------1 12 BOOKS 2005-1-14 14:19:2 12 BOOKS 2005-2-13 14:19:SQL>SQL> select * from dinya_test partition(part_02);TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE--------------------------------------------------------------------------------3 12 BOOKS 2006-5-304 12 BOOKS 2007-6-23SQL>SQL> select * from dinya_test partition(part_03);TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE--------------------------------------------------------------------------------5 12 BOOKS 2011-2-266 12 BOOKS 2011-4-30SQL>从查询的结果可以看出,插入的数据已经根据交易时间范围存储在不同的分区中。