1、分区索引
分区索引就是简单地把一个索引分成多个片断。通过把一个索引分成多个片断,可以访问更小的片断(也更快),并且可以把这些片断分别存放在不同的磁盘驱动器上(避免I/O问题)。B树和位图索引都可以被分区,而HASH索引不可以被分区。可以有好几种分区方法:表被分区而索引未被分区;表未被分区而索引被分区;表和索引都被分区。不管采用哪种方法,都必须使用基于成本的优化器。分区能够提供更多可以提高性能和可维护性的可能性。
1、有两种类型的分区索引:本地分区索引和全局索引。
每个类型都有两个子类型,有前缀索引和无前缀索引。表各列上的索引可以有各种类型索引的组合。如果使用了位图索引,就必须是本地索引。把索引分区最主要的原因是可以减少所需读取的索引的大小,另外把分区放在不同的表空间中可以提高分区的可用性和可靠性。
在使用分区后的表和索引时,Oracle还支持并行查询和并行DML。这样就可以同时执行多个进程,从而加快处理这条语句。
(1)有前缀的分区索引指包含了分区键,并且将其作为引导列的索引。
如:
create index i_id_global on PDBA(id) global --引导列
2 partition by range(id) --分区键
3 (partition p1 values less than (200),
4 partition p2 values less than (maxvalue)
5 );
这里的ID 就是分区键,并且分区键id 也是索引的引导列。
(2)无前缀的分区索引的列不是以分区键开头,或者不包含分区键列。
如:
create index ix_custaddr_local_id_p on custaddr(id)
local (
partition t_list556 tablespace icd_service,
partition p_other tablespace icd_service
)
这个分区是按照areacode来的。但是索引的引导列是ID。所以它就是非前缀分区索引。
(3)全局分区索引不支持非前缀的分区索引,如果创建,报错如下:
sql> create index i_time_global on PDBA(id) global --索引引导列
2 partition by range(time) --分区建
3 (partition p1 values less than (TO_DATE('2010-12-1', 'YYYY-MM-DD')),
4 partition p2 values less than (maxvalue)
5 );
partition by range(time)
*
第 2 行出现错误:
ORA-14038: GLOBAL 分区索引必须加上前缀
2、Local索引肯定是分区索引,Global索引可以选择是否分区,如果分区,只能是有前缀的分区索引。
2、类型
1)本地索引---局部分区索引 --局部索引比全局索引容易管理, 而全局索引比较快。
其分区形式与表的分区完全相同,依赖列相同,存储属性也相同。对于本地索引,其索引分区的维护自动进行,就是说你add/drop/split/truncate表的分区时,本地索引会自动维护其索引分区。
在表分区后,对每个表分区建立一个索引,对表的索引进行均匀分区称为局部分区。
局部分区索引广泛的应用在大型OLAP的数据仓库中。支持更高的高可用性,某个分区表的数据出现问题,只影响该分区表对应的局部索引,单独重构局部索引就行,而且恢复起来更方便,如果知道表进行MOVE后,ROWID变化了,所以索引也需要REBUILD,分区表也可以对单个分区进行MOVE,因为局部分区索引是跟表分区一致的,所以只要是对单个表分区进行MOVE,我们也只需要REBUILD单个局部索引分区,分区表技术可以实现将某一个分区恢复到某个时间点,而局部分区索引同步到该时间点,而数据仓库大量的IO容易造成部分磁盘或IO损坏,如果用局部分区索引影响非常小
2)全局索引: -----Oracle只支持2中类型的全局分区索引:range partitioned 和 Hash Partitioned.
即可以分区,也可以不分区。即可以建range分区,也可以建hash分区,即可建于分区表,又可创建于非分区表上,就是说,全局索引是完全独立的,因此它也需要我们更多的维护操作。
全局索引分区数据指向任何一个表分区的分区索引,9I全局索引只有范围全局索引,10G有HASH全局索引。
全局索引以前常用在OLTP。维护麻烦,影响到所有的全局分区索引,OLTP中最重要的是数据的完整性和准确性,而全局分区索引的及时重构将使得可靠性得到保证。
3、与分区索引有关的视图
dba_part_indexes 分区索引的概要统计信息,可以得知每个表上有哪些分区索引,分区索引的类型(local/global)
dba_ind_partitions 每个分区索引的分区级统计信息
dba_indexes minus dba_part_indexes (minus操作)可以得到每个表上有哪些非分区索引
create index i_id_global on PDBA(id) global
partition by range(id)
(partition p1 values less than (200),
partition p2 values less than (4000),
partition p3 values less than (8000),
partition p4 values less than (maxvalue)
);
示例:
1、查询分区索引相关属性:索引类型 ---dba_part_indexes
SQL> select index_name,table_name,partitioning_type,locality,ALIGNMENT from
dba_part_indexes where table_name='PDBA';
INDEX_NAME TABLE_NAME PARTITI LOCALI ALIGNMENT
------------------------------ ------------------------------ ------- ------ ------------
I_ID_GLOBAL PDBA RANGE GLOBAL PREFIXED
2、查询索引关联的分区信息 --dba_ind_partitions
SQL> select index_name,partition_name, status from dba_ind_partitions where index_name='I_ID_GLOBAL';
INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ --------
I_ID_GLOBAL P1 USABLE
I_ID_GLOBAL P2 USABLE
I_ID_GLOBAL P3 USABLE
I_ID_GLOBAL P4 USABLE
3、查看索引对应的列 --dba_ind_partitions
set linesize 230
col column_name format a30
SQL> select table_name,index_name,column_name from dba_ind_columns where table_name='PDBA' and table_owner='SYS';
TABLE_NAME INDEX_NAME COLUMN_NAME
------------------------------ ------------------------------ ------------------------------
PDBA I_ID_GLOBAL ID
4、查询非分区索引的基础信息:存储 --dba_indexes
SQL> select owner,index_name,table_name,status from dba_indexes where INDEX_NAME='I_ID_GLOBAL';
OWNER INDEX_NAME TABLE_NAME STATUS
------------------------------ ------------------------------ ------------------------------ --------
SYS I_ID_GLOBAL PDBA N/A