1. 创建索引分区
对大数据量索引进行分区同样能够优化应用系统的性能。一般来说,如果索引所对应的表的数据量非常大,如几百万甚至上千万条数据,则索引会占用很大的空间,这时建议对索引进行分区。
1.1. 索引分区概述
Oracle索引分区分为本地索引分区和全局索引分区两种。全局索引不反映基础表的结构,因此若要分区就只能进行范围分区。而局部索引反映基础表的结构,因此对表的分区或子分区进行维护时,系统会自动对本地索引的分区进行维护,所以不需要用户对本地索引的分区进行维护。
1.2. 本地索引分区
本地索引分区就是使用和分区表同样的分区键进行分区的索引。也就是说,索引分区所采用的列与该表的分区所采用的列是相同的。本地索引分区有如下优点:
如果只有一个分区需要维护,则只有一个本地索引受影响。
支持分区独立性。
只有本地索引能够支持单一分区的装入和卸载。
表分区和各自的本地索引可以同时恢复。本地索引可以单独重建。
位图索引仅由本地索引支持。
若要创建本地索引分区,可以使用CREATE INDEX…LOCAL子句。
创建一个表分区,然后根据这个表分区创建本地索引分区,操作步骤及代码如下:
①准备好所需要的表空间。使用CREATE TABLESPACE语句创建3个表空间,这3个表空间应放在不同的磁盘分区上,我这里使用的CentOS系统,没有不同的磁盘分区,这里创建到不同的目录下,分别是ts_1、ts_2、ts_3,
代码如下:
create tablespace ts_1 datafile '/opt/oracle/oradata/ORDATA1/ts1.dbf' size 10m extent management local autoallocate;
create tablespace ts_2 datafile '/opt/oracle/oradata/ORDATA2/ts2.dbf' size 10m extent management local autoallocate;
create tablespace ts_3 datafile '/opt/oracle/oradata/ORDATA3/ts3.dbf' size 10m extent management local autoallocate;
②创建一个存储学生成绩的分区表studentgrade,该表共有3个分区,分别位于表空间ts_1、ts_2和ts_3上,
代码如下:
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个分区(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
);
④可以通过查询dba_ind_partitions视图来查看索引分区信息,
代码如下:
select partition_name,tablespace_name from dba_ind_partitions where index_name = 'GRADE_INDEX';
2. 全局索引分区
全局索引分区就是没有与分区表采用相同分区键的分区索引。当分区中出现许多事务并且要保证所有分区中的数据记录唯一时,采用全局索引分区。无论表是否采用分区,都可以对表采用全局索引分区。此外,不能对Cluster表、位图索引采用全局索引分区。以books表的saleprice列为索引列和分区键,创建一个范围分区的全局索引,
代码如下:
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分区的全局索引,
代码如下:
create index index_ISBN on books(ISBN)
global partition by hash(ISBN);
3. 管理操作列表
对索引分区进行维护,应该使用ALTER INDEX语句,其对应的子句如下表所示。
与表分区不同的是,索引分区分为两种类型,即全局索引和局部索引。
4. 删除索引分区
删除索引分区可通过ALTER INDEX…DROP PARTITION语句来实现。在books表的index_saleprice索引中,使用ALTER INDEX…DROP PARTITION语句删除其中的索引分区p2,
代码如下:
alter index index_saleprice drop partition p2;
注意:对于全局索引分区,不能删除索引的最高分区,否则系统会提示错误。
在删除若干索引分区之后,如果只剩余一个索引分区,则需要对这个分区进行重建,重建分区可以使用ALTER INDEX…REBUILD PARTITION语句来实现。
在books表的index_saleprice索引中,删除其中的p2和p1索引分区,然后使用ALTER INDEX…REBUILD PARTITION语句重建索引分区p3,
代码如下:
alter index index_saleprice drop partition p2;
alter index index_saleprice drop partition p1;
alter index index_saleprice rebuild partition p3;
5. 重命名索引分区
重命名索引分区与重命名索引的语法格式比较接近,
其语法格式如下:
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,
代码如下:
alter index index_saleprice rename partition p3 to p_new;