1.分区技术简介

分区功能能够改善应用程序的性能,可管理性和可用性,是数据库管理中一个非常关键的技术。
尤其在今天,数据库应用系统的规模越来越大,还有海量数据的数据仓库系统,因此,几乎所有的Oracle数据库都使用分区功能来提高查询的性能,并且简化数据库的日常管理维护工作。

那么使用分区技术有哪些优点呢?具体如下:

(1)减少维护工作量,独立管理每个分区比管理单个大表要轻松得多。
(2)增强数据库得可用性,如果表的一个或几个分区由于系统故障不能使用,而表其余的分区仍然可以使用;如果系统故障只影响表的一个部分分区,那么,只有这部分分区需要修复,这就比修复整个大表耗费的时间少许多。
(3)均衡I/O,减少竞争,通过把表的不同分区分配到不同的磁盘来平衡I/O改善性能。
(4)分区对用户保护透明,最终用户感觉不到分区的存在。
(5)提高查询速度:对大表的查询,增加,修改等操作可以分解到表的不同分区中来并行执行,这样可以加快运行速度,对数据仓库的TP查询尤其有用。

Oracle 11g 相对于其它低版本的Oracle在分区方面增加了很多功能,具体如下:
(1)引入扩展的分区功能。
(2)Interval分区。
(3)外键分区。
(4)虚拟列分区。
(5)引入了分区建议器。

分区技术主要包括表分区和索引分区。

2.创建表分区

2.1 范围分区

创建范围分区的关键字是RANGE,创建该分区后,其中的数据可以根据分区键值指定的范围进行分布,当数据在范围内均匀分布时,性能最好。

当表结构采用范围分区时,首先要考虑分区的列应该符合范围分区的方法;其次要考虑列的数据值的取值范围;最后考虑列的边界问题。

**** 创建一个商品零售表,然后为该表按照销售日期所在的季度创建4个分区,代码:

SQL> create table ware_retail_part	-- 创建一个描述商品零售的数据表
(
	id integer primary key,			-- 销售编号
	retail_date date,				-- 销售日期
	ware_name varchar2(50)			-- 商品名称
)
partition by range(retail_date)
(
	-- 2019年第一个季度为par_01分区
	partition par_01 values less than(to_date('2019-04-01','yyyy-mm-dd')) tablespace TBSP_1,
	-- 2019年第二个季度为par_02分区
	partition par_02 values less than(to_date('2019-07-01','yyyy-mm-dd')) tablespace TBSP_1,
	-- 2019年第三个季度为par_03分区
	partition par_03 values less than(to_date('2019-10-10','yyyy-mm-dd')) tablespace TBSP_2,
	-- 2019年第四个季度为par_04分区
	partition par_04 values less than(to_date('2020-01-01','yyyy-mm-dd')) tablespace TBSP_2
);

表已创建。
*** 向表ware_retail_part插入3条记录,代码:
SQL> insert into ware_retail_part values(1,to_date('2019-01-20','yyyy-mm-dd'),'平板电脑');

已创建1行。

SQL> insert into ware_retail_part values(2,to_date('2019-04-15','yyyy-mm-dd'),'智能手机');

已创建1行。

SQL> insert into ware_retail_part values(1,to_date('2019-07-25','yyyy-mm-dd'),'MP5');

已创建1行。

在向ware_retail_part表中插入若干条记录之后,用户就可以通过分区表(即进行了分区的数据表)来查询数据了,这种方式的查询速度要比从整个表中查询快得多,使用分区表查看数据的例子如下:

**** 查询数据表ware_tetail_part中分区part_02中的全部记录。代码:
SQL> select * from ware_retail_part partition(par_02);

另外,RANGE分区的字段可以是两个或者多个。
 

**** 创建一个商品零售表,然后为该表按照销售编号和销售日期的组合创建3个分区,代码:
SQL> create table ware_retail_part	-- 创建一个描述商品零售的数据表
(
	id integer primary key,			-- 销售编号
	retail_date date,				-- 销售日期
	ware_name varchar2(50)			-- 商品名称
)
partition by range(id,retail_date)
(
	-- 第一个分区 par_01
	partition par_01 values less than(10000,to_date('2019-12-01','yyyy-mm-dd')) tablespace TBSP_1,
	-- 第一个分区 par_02
	partition par_02 values less than(20000,to_date('2020-12-01','yyyy-mm-dd')) tablespace TBSP_1,
	-- 第一个分区 par_03
	partition par_03 values less than(maxvalue,maxvalue) tablespace TBSP_2 15 );

表已创建。
在上面的例子中,partition by range(id,retail_date)作为分区方法,id和retail_date作为分区键,
即按销售编号和销售日期的组合来进行区分。语句"partition par_01 values less than(10000,to_date('2019-12-01','yyyy-mm-dd')) tablespace TBSP_1" 表示一个分区的定义,当插入
记录的销售日期小于2019年12月1日,并且销售编号小于10000时,则将该记录划分为分区par_01并存放在TBSP_1
表空间上。

2.2 散列分区

HASH分区,也叫作散列分区,是在列的取值难以确定的情况下采用的分区方法。例如,按照身份证号进行分区,就很难确定身份证号的分区范围。HASH实际上是一种函数算法,当向表中插入数据时,系统会自动根据当前分区列的值计算出HASH值,然后确定应该将该行存放于哪个表空间中。

    HASH分区通过指定分区编号将数据均匀分布在磁盘设备上,使得这些分区大小一致,这充分降低了I/O磁盘争用的情况,但是该分区方法对于范围查询或不等式查询起不到优化的作用。

一般来说,下面几种情况可以采用HASH分区。
	
	(1)HASH分区可以由HASH键来分布。
	(2)DBA无法获知具体的数据值。
	(3)数据的分布由Oracle处理。
	(4)每个分区有自己的表空间。
**** 创建一个商品零售表,然后将该表id列的值根据自身情况散列地存放在指定的两个表空间中,代码:
SQL> create table ware_retail_part	-- 创建一个描述商品零售的数据表
(
	id integer primary key,			-- 销售编号
	retail_date date,				-- 销售日期
	ware_name varchar2(50)			-- 商品名称
)
partition by hash(id)
(
	partition par_01 tablespace TBSP_1,	-- 创建par_01分区
	partition par_02 tablespace TBSP_2	-- 创建par_02分区
)
表已创建。

在为商品零手表ware_retail_part3创建了2个HASH分区之后。

**** 向表ware_retail_part3插入一条记录,代码:
SQL> insert into ware_part3 values(99,to_date('2019-11-11','yyyy-mm-dd'),'电脑');

已创建1行。

那么上面插入的记录到底被分配到哪个分区中,用户无法直接判断,而是由Oracle系统通过计算id的HASH值(这里是99),然后系统按照均匀分布的原则自动分配的。

在上面的若干个创建表分区的例子中,都为表分区指定了名称,在Oracle 11g中,可以实现由系统自动分配分区名。

*** 首先创建一个表person,然后为该表创建HASH列分区(分区列为id),要求创建的两个分区由系统自动生成分区名,并分别放置在表空间tbsp_1和tbsp_2中,代码:

SQL> create table person		--创建以一个描述个人信息的表
(
	id number primary key,		-- 个人的编号
	name varchar2(20),		-- 姓名
	sex varchar2(2)			-- 性别
)
partition by hash(id)		-- 使用id作为HASH分区的键值
partition 2				-- 创建两个分区,分区名由系统自动给出
store in(tbsp_1,tbsp_2);		-- 指定两个不同的命名空间

表已创建。

说明:HASH分区表的每个分区保存在不同的表空间中,这样HASH数据也就被存放在不同的表空间中。

另外,在创建HASH分区表时,用户还可以指定所有分区的初始分配空间。

**** 首先创建一个表goods,然后为该表创建HASH列分区(分区列为id),要求为创建的表分区指定初始化空间,大小为2048KB,代码:
SQL> create table goods		-- 定义包含商品信息的表
(
	id number,				-- 编号
	goodname varchar2(50)		-- 名称
)
storage(initial 2048k)		-- 定义表分区的初始化空间大小为2048
partition by hash(id)		-- 创建id列作为分区键的HASH表分区
(
	partition par1 tablespace tbsp_1,		-- 表分区 par1
	partition apr2 tablespace tbsp_2		-- 表分区 par2
);
表已创建。

上例指定了各个分区的名称及其所有存放的表空间,所有分区的大小都继承表空间的初始化分配参数值--2048KB.

2.3 列表分区

列表分区关键字是LIST,如果表的某个列的值可以枚举,则可以考虑对标进行列表分区。

**** 首先创建一个用于保存客户信息的表clients,然后以province列作为分区键创建列表分区,代码:
SQL> create table clients		-- 创建客户表
(
	id integer primary key,		-- 客户编号
	name varchar2(50),		-- 客户名称
	province varchar2(20)		-- 客户所在省份
)
partition by list(province)	-- 以province列为分区键创建列表分区
(
	partition shandong values('山东'),		-- 山东省份区
	partition guangdong values('广东'),		-- 广东省份区
	partition yunnan values('云南省')		-- 云南省份区
);

表已创建。

在为客户表clients创建了列表分区之后,接下来向该表中插入一条记录。

*** 向表clients插入一条记录,省份字段的值为"云南省",代码:
SQL> insert into client values(19,'东方','云南省');
已创建1行。

SQL> column name for a20;
SQL> select * from clients partition(yunnan);

2.4 组合分区

结合两种数据分区的方法可以成为一个组合分区的方法。首先用第一个数据分区方法对表格进行分区,然后再用第二个数据分区方法对每个分区进行二次分区。

Oracle 11g支持以下的组合分区方案:
(1)组合范围-范围分区。
(2)组合列表-范围分区。
(3)组合范围-散列分区。
(4)组合范围-列表分区。
(5)组合列表-列表分区。
(6)组合列表-散列分区。

注意:目前的Oracle仅支持对索引组织表(索引和数据一起的表格)进行范围分区,列表分区或散列分区,但不支持对其进行组合分区。

首先创建一个保存人员信息的数据表person2,然后创建3个范围分区,每个分区又包含2个子分区,子分区没有名称,由系统自动生成,并要求将其分布在2个指定的表空间中,代码:

SQL> create table person2		-- 创建一个描述个人信息的表
(
	id number primary key,		-- 个人的编号
	name varchar2(20),		-- 姓名
	sex varchar2(2)			-- 性别
)
partition by range(id)		-- 以id作为分区键创建范围分区
subpartition by hash(name)		-- 以name列作为分区键创建HASH子分区
subpartition 2 store in(tbsp_1,tbsp_2)		-- HASH子分区公有两个,分布存储在两个不同的命名空间中
(
	partition par1 values less than(5000),	-- 范围分区,id小于5000
	partition par2 values less than(10000),	-- 范围分区,id小于10000
	partition par3 values less than(maxvalue)	-- 范围分区,id不小于10000
);
表已创建。

该例首先按照范围进行分区,然后对子分区按照HASH进行分区,根据name列的HASH值确定该行分布在tbsp_1或tbsp_2某个表空间。

2.5 Interval分区

Interval分区的关键字是INTERVAL,它是Oracle 11g版本新引入的分区方法,是范围分区的一种增强功能,可以实现equi_sized范围分区的自动化。该方法创建的分区作为元数据,只有最开始的分区是永久分区。随着数据的增加会分配更多的部分,并自动创建新的分区和本地索引。

**** 首先创建一个表saleRecord,然后为该表创建Interval分区,代码:
SQL> create table saleRecord
(
	id number primary key,		-- 编号
	goodsname varchar2(50),		-- 商品名称
	saledate date,			-- 销售日期
	quantity number			-- 销售量
)
partition by range(saledate)	-- 以销售日期为分区键
interval(numtoyminterval(1,'year'))	-- Interval分区实现按年份进行自动分区
(
	-- 设置分区键值日期小于2019-01-01
	partition par_fist values less than(to_date('2019-01-01'),'yyyy-mm-dd');
);
表已创建。

在上面的代码中,函数NUMTOYMINTERVAL的功能是将数字转换成YEAR或者MONTH。

说明:进行Interval分区的表格有传统的范围部分和自动生成的Interval部分。对于已经进行了范围分区的表格,可以通过使用ALTER TABLE命令的SET INTERVAL选项扩展成为Interval分区的表格。

3. 表分区策略

对表进行分区设计时,首先要考虑和分析分区表中每个分区的数据量,其次要为每个分区创建相应的表空间。

3.1 识别大表

一般来说,数据占用存储空间大的表就是大表,系统架构师要做的就是确定哪些表属于大表。如果要在目前运行的系统上进行表数据量分析,那么主要采用ANALYZE TABLE语句进行分析,然后查询数据字典获得相应的数据量;如果面对的是一个正在需求分析的表,就只能采用估计的方法了。
 

3.2 大表如何分区

大表一般可以按时间分区,例如,如果按照月份分区,则需要为每个月创建一个数据表空间;如果按照季度分区,则一年要创建4个表空间;如果要存放5年用的表空间,则需要创建20个表空间。

3.3 分区的表空间规划

分区方法确定后,就要着手创建表空间,创建表空间前要对每个表空间的大小进行估算。如果每个季度的数据100MB,则最好创建120MB的季度用表空间。另外,还要考虑数据量的增长,如当年的数据是每季度100MB,则下一年可能要增长20%~30%,这些变化都要在表空间大小上给予考虑。
 

4. 管理表分区

当在应用设计中采用分区技术创建表和索引时,数据库管理员需要对分区进行管理,包括经常查看各个有关表空间的存储情况,是否需要增加新的表空间,合并小的分区以及删除不需要的表分区等。

4.1 添加表分区

对于已经存在的表分区的某个表,如果要添加一个新的表分区,通常使用ALTER TABLE...ADD PARATITION语句,下面来看一个例子。

**** 在客户信息表client中,添加一个省份为"河北省"的表分区,代码:
	SQL> alter table clients
		add partition hebei values('河北省')
		storage(initial 10K next 20K) tablespace tbsp_1
		nologging;
	
	表已更改。

上面的例子不仅增加了分区hebei,而且给增加的分区指定了存储属性。

4.2 合并分区

    Oracle可以对表和索引进行分区,也可以对分区进行合并,从而减少散列分区或者复合分区的个数。在合并表分区之后,Oracle系统将做以下处理。
    (1)在合并分区时,HASH列函数将分区内容分布到一个或多个保留分区中。
    (2)原来内容所在的分区完全被清除。
    (3)与分区对应的索引也被清除。
    (4)将一个或多个索引的本地索引分区标识为不可用(UNUSABLE)。
    (5)需要对不可用的索引进行重建。

**** 合并散列分区
使用ALTER TABLE...COALESCE PARTITIOIN语句可以完成HASH列分区的合并。

合并person分区表中的一个HASH分区,代码:
SQL> alter table person coalesce partition;

表已更改。

**** 合并复合分区
可以使用ALTER TABLE...MODIFY语句实现将某个子分区的内容重新分配到一个或者多个保留的子分区中。

把person2分区表中的par3分区合并到其它保留的子分区中。代码:
SQL> alter table person2 modify partition par3 coalesce subpartition;

表已更改。

4.3 删除分区

可以从范围分区或复合分区中删除分区。但是散列分区和复合分区的散列子分区,只能通过合并来达到删除的目的。

(1)删除一个表分区

可以使用ALTER TABLE...DROP PARTITION语句删除范围分区和复合分区。删除分区时,该分区的数据也被删除。如果不希望删除数据,则必须采用合并分区的方法。

SQL> alter table ware_retail_part drop partition par_04;

表已更改。

(2)删除有数据和全局索引的表分区。

如果分区表中包含了数据,并且在表中定义了一个或者多个全局索引,可以使用ALTER TABLE...DROP PARTITION语句删除表分区,这样可以保留全局索引,但是索引会被标识为不可用(UNUSABLE),因而需要重建索引。

**** 删除ware_retail_part分区表中得par_04分区,然后重建索引ware_Index,代码:
SQL> alter table ware_retail_part drop partition par_04;

表已更改。
SQL> alter index ware_index rebuild;

索引已更改。
在上面的例子中,如果ware_index是范围分区的全局索引,那么就需要重建所有索引的分区,如:
alter index ware_index rebuild index_01;
alter index ware_index rebuild index_02;
alter index ware_index rebuild index_03;

(3)使用DELETE和ALTER TABLE...DROP PARTITION语句

在执行ALTER TABLE...DROP PARATITIOIN语句前首先执行DELETE语句来删除分区的所有数据,然后执行ALTER TABLE...DROP PARTITION语句,但是执行DELETE语句时需要更新全局索引。

**** 首先删除ware_retail_part分区表中的第四季度的数据,然后再删除第四季度数据对应的par_04分区,代码:
SQL> delete from ware_retail_part where retail_date>=to_date('2011-10-01','yyyy-mm-dd');

已删除513行。

SQL> alter table ware_retail_part drop partition par_04;

表已更改。

(4)删除具有完整性约束的分区

如果分区的表具有完整性约束,则可以采用以下两种方法。

*** 首先禁止完整性约束,然后执行ALTER TABLE...DROP PARTITION语句时,最后激活约束。

a. 首先禁用books_1表的主键约束BOOK_PK,然后删除books_1表的分区part_01, 最后激活books_1表的主键约束BOOK_PK,代码:
SQL> alter table books_1 disable constraints BOOK_PK;

表已更改。

SQL> alter table books_1 drop partition part_01;

表已更改。

SQL> alter table books_1 enable constraints BOOK_PK;

表已更改。

**** 首先执行DELETE语句删除分区中的行,然后用ALTER TABLE...DROP PARTITION语句删除分区。
b. 首先删除books_1表part_01分区中的所有记录,然后再删除part_01分区,代码:
SQL> delete from books_1 where bookno<1000;

已删除12行。

SQL> alter table books_1 drop partition part_01;

表已更改。

4.4 并入分区

用户可以使用MERGE PARTITION语句将相邻的范围分区合并在一起变为一个新的分区:该分区继承原来两个分区的边界;原来的两个分区与相应的索引一起被删除掉;如果被合并的分区非空,则该分区被标识为UNUSABLE;不能对HASH分区表执行MERGE PARTITION语句。

并入范围分区是将两个以上的分区合并到一个存在的分区中,合并后一般要重建索引。

**** 首先在sales表中创建4个范围分区,然后再将第三个分区并入到第四个分区中,操作步骤及代码如下:

(1)首先创建一个销售记录表sales,然后对该表的记录按照销售日期(即季度)分为4个范围分区,代码:
SQL> create table sales			-- 创建一个销售记录表
(
	id number primary key,			-- 记录编号
	goodsname varchar2(10),			-- 商品名
	saledate date				-- 销售日期
)
partition by range(saledate)		-- 按照日期分区
(
	-- 第一季度数据
	partition part_sea1 values less than(to_date('2019-04-01','yyyy-mm-dd')) tablespace tbsp_1,
	-- 第二季度数据
	partition part_sea2 values less than(to_date('2019-07-01','yyyy-mm-dd')) tablespace tbsp_2,
	-- 第三季度数据
	partition part_sea3 values less than(to_date('2019-10-01','yyyy-mm-dd')) tablespace tbsp_1,
	-- 第四季度数据
	partition part_sea4 values less than(to_date('2020-01-01','yyyy-mm-dd')) tablespace tbsp_2
);

表已创建。

(2)在sales表中创建局部索引,代码:

SQL> create index index_3_4 on sales(saledate)
		local(
			partition part_seal tablespace tbsp_1,
			partition part_sea2 tablespace tbsp_2,
			partition part_sea3 tablespace tbsp_1,
			partition part_sea4 tablespace tbsp_2
		);
	索引已创建。

(3)使用ALTER TABLE...MERGE PARTITION语句把第三个分区并入到第四个分区中,代码:

SQL> alter table sales merge partitions part_sea3,part_sea4 into partition part_sea4;
	
	表已更改。

(4)最后重新建立局部索引,代码:
	SQL> alter table sales modify partition part_sea4 rebuild unusable local indexes;

	表已更改。

5. 创建索引分区

对大数据量索引进行分区同样能够优化应用系统的性能。一般说来,如果索引所对应的表的数据量非常大,例如,几百万甚至上千万条数据,则索引也会占用很大的空间,这时,建议对索引进行分区。

5.1 索引分区概述

Oracle索引分区分为本地索引分区和全局索引分区两种。

全局索引分区不反映基础表结构,因此,若要分区就只能进行范围分区。而局部索引反映基础表的结构,因此,对表的分区或子分区进行维护时,系统会自动对本地索引的分区进行维护,而不需要对本地索引的分区进行维护。

5.2 本地索引分区

本地索引分区就是使用和分区表同样的分区键进行分区的索引,也就是说,索引分区所采用的列与该表的分区所采用的列是相同的。本地索引分区有如下优点:
(1)如果只有一个分区需要维护,则只有一个本地索引受影响。
(2)支持分区独立性。
(3)只有本地索引能够支持单一分区的装入和卸载。
(4)表分区和各自的本地索引可以同时恢复。
(5)本地索引可以单独重建。
(6)位图索引仅由本地索引支持。

若要创建本地索引分区,可以使用CREATE INDEX...LOCAL子句。

**** 首先创建一个表分区,然后根据这个表分区创建本地索引分区,操作步骤和代码:

(1)准备好所需要的空间。
    使用CREATE TABLESPACE语句创建3个表空间,这3个表空间应放在不同的磁盘分区上,分别是ts_1, ts_2, ts_3, 代码如下:

SQL> create tablespace ts_1 datafile 'D:\OracleFiles\OracleData\ts1.dbf'
		size 10m
		extent management local autoallocate;

	表空间已创建。


	SQL> create tablespace ts_2 datafile 'E:\OracleFiles\OracleData\ts2.dbf'
		size 10m
		extent management local autoallocate;

	表空间已创建。

	SQL> create tablespace ts_3 datafile 'E:\OracleFiles\OracleData\ts3.dbf'
		size 10m
		extent management local autoallocate;

	表空间已创建。

(2)创建一个存储学生成绩的分区表studentgrade,该表共有3个分区,分别位于表空间ts_1, ts_2和ts_3上,代码及运行结果如下:

SQL> create table studentgrade
	(
		id number primary key,		-- 记录id
		name varchar2(10),		-- 学生名称
		subject varchar2(10),		-- 学科
		grade number			-- 成绩
	)
	partition by range(grade)
	(
		-- 小于60分,不及格
		partition par_nopass values less than(60) tablespace ts_1,
		-- 小于70分,及格
		partition par_pass values less than(70) tablespace ts_2,
		-- 大于或等于70分,优秀
		partition par_good values less than(maxvalue) tablespace ts_3
	);
	
	表已创建。

(3)接下来,根据表分区创建本地索引分区,与表分区一样,索引分区也是3个分区(p1, p2, p3),代码:

SQL> 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视图来查看索引分区信息,代码:

SQL> select partition_name,tablespace_name from dba_ind_partitions where index_name='GRADE_INDEX';

5.3 全局索引分区

全局索引就是与分区表采用相同分区键的分区索引。当分区中出现许多事务并且要保证所有分区中的数据记录唯一时,采用全局索引分区。

无论表是否采用分区,都可以对表采用全局索引分区。此外,不能对Cluster表,位图索引采用全局索引分区。

*** 以books表的saleprice列为索引和分区键,创建一个范围分区的全局索引,代码:
SQL> create index index_saleprice on books(saleprice)
	global partition by range(saleprice)
	(
		partition p1 values less than(30),
		partition p2 values less than(50),
		partition p3 values less than(maxvalue)
	);
	索引已创建。


**** 以books表的ISBN列为索引列和分区键,创建一个HASH分区的全局索引,代码:
SQL> create index index_ISBN on books(ISBN)
		global partition by hash(ISBN);
索引已创建。

6. 管理索引分区

对索引分区可以进行删除,重建,重命名等操作。

6.1 索引分区管理的操作列表

对索引分区进行维护,应该使用ALTER INDEX语句,其对应的子句如表。与表分区不同的是,索引分区分为两种类型,全局索引和本地索引。

对索引分区进行维护的 ALTER INDEX子句

维护类型			索引类型		范围分区		HASH或LIST分区		组合分区

删除索引分区		全局			DROP PARTITION
				局部			无效

重建索引分区		全局			REBUILD PARTITION
				局部			REBUILD PARTITION					RETUILD SUBPARTITION

更名索引分区		全局			RENAME PARTITION
				局部			RENAME PARTITION					RENAME SUBPARTITION

分割索引分区		全局			SPLIT PARTITION
				局部			无效

6.2 索引分区管理的实际操作

在管理索引分区的各种操作中,常用的操作主要包括删除索引分区和重命名索引分区。

(1)删除索引分区
可通过ALTER INDEX...DROP PARTITION语句来删除索引分区,示例如下:

**** 在books表的index_saleprice索引中,使用ALTER INDEX...DROP PARTITION语句删除其中的索引分区p2,代码:
SQL> alter index index_saleprice drop partition p2;
索引已更改。

注意: 对于全局索引分区,不能删除索引的最高分区,否则系统会提示错误。

在删除若干索引分区之后,如果只剩余一个索引分区,则需要对这个分区进行重建,重建分区可以使用ALTER INDEX...REBUILD PARTITION语句来实现。

**** 在books表的index_saleprice索引中,删除其中的p2和p1索引分区,然后使用ALTER INDEX...REBUILD PARTITION语句重建索引分区p3,代码:
SQL> alter index index_saleprice drop partition p2;

索引已更改。

SQL> alter index index_saleprice drop partition p1;

索引已更改。

SQL> alter index index_saleprice rebuild partition p3;

索引已更改。


(2)重命名索引分区

	重命名索引分区与重命名索引的语法格式比较接近,语法格式如下:
	ALTER INDEX index_name
	RENAME PARTITION partition_old_name TO partition_new_name

	index_name: 索引名称。
	partition_old_name: 原索引分区名称。
	partition_new_name: 新索引分区名称。

**** 在index_saleprice索引中,使用ALTER INDEX...RENAME PARTITION语句重命名索引分区p3,代码:
SQL> alter index index_saleprice rename partition p3 to p_new;

索引已更改。