Oracle 19C索引分区

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值