`

Oracle分区索引--本地索引和全局索引比较

 
阅读更多

本文基于Oracle 10gR2

分区索引分为本地(local index)索引和全局索引(global index)

其中本地索引又可以分为有前缀(prefix)的索引和无前缀(nonprefix)的索引。而全局索引目前只支持有前缀的索引。B树索引和位图索引都可以分区,但是HASH索引不可以被分区。位图索引必须是本地索引。下面就介绍本地索引以及全局索引各自的特点来说明区别;

一、本地索引特点:

1.        本地索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区说,一句话,本地索引的分区机制和表的分区机制一样。

2.        如果本地索引的索引列以分区键开头,则称为前缀局部索引。

3.        如果本地索引的列不是以分区键开头,或者不包含分区键列,则称为非前缀索引。

4.        前缀和非前缀索引都可以支持索引分区消除,前提是查询的条件中包含索引分区键。

5.        本地索引只支持分区内的唯一性,无法支持表上的唯一性,因此如果要用本地索引去给表做唯一性约束,则约束中必须要包括分区键列。

6.        本地分区索引是对单个分区的,每个分区索引只指向一个表分区,全局索引则不然,一个分区索引能指向n个表分区,同时,一个表分区,也可能指向n个索引分区,对分区表中的某个分区做truncate或者moveshrink等,可能会影响到n个全局索引分区,正因为这点,本地分区索引具有更高的可用性。

7.        位图索引只能为本地分区索引。

8.        本地索引多应用于数据仓库环境中。

本地索引:创建了一个分区表后,如果需要在表上面创建索引,并且索引的分区机制和表的分区机制一样,那么这样的索引就叫做本地分区索引。本地索引是由ORACLE自动管理的,它分为有前缀的本地索引和无前缀的本地索引。什么叫有前缀的本地索引?有前缀的本地索引就是包含了分区键,并且将其作为引导列的索引。什么叫无前缀的本地索引?无前缀的本地索引就是没有将分区键的前导列作为索引的前导列的索引。下面举例说明:

create table test (id number,data varchar2(100))
partition by RANGE (id)
(
partition p1 values less than (1000) tablespace p1,
partition p2 values less than (2000) tablespace p2,
partition p3 values less than (maxvalue) tablespace p3
);

create index i_id on test(id) local; 因为id是分区键,所以这样就创建了一个有前缀的本地索引。

SQL> select dbms_metadata.get_ddl('INDEX','I_ID','ROBINSON') index_name FROM DUAL;  ------去掉了一些无用信息

INDEX_NAME

 

--------------------------------------------------------------------------------

 CREATE INDEX "ROBINSON"."I_ID" ON "ROBINSON"."TEST" ("ID") LOCAL

 (PARTITION "P1" TABLESPACE "P1" , PARTITION "P2" TABLESPACE "P2" ,PARTITION "P3" TABLESPACE "P3" );

也可以这样创建:

SQL> drop index i_id;

Index dropped

SQL> CREATE INDEX "ROBINSON"."I_ID" ON "ROBINSON"."TEST" ("ID") LOCAL
  2  (PARTITION "P1" TABLESPACE "P1" , PARTITION "P2" TABLESPACE "P2" ,PARTITION "P3" TABLESPACE "P3" );

Index created

create index i_data on test(data) local;因为data不是分区键,所以这样就创建了一个无前缀的本地索引。

SQL> select dbms_metadata.get_ddl('INDEX','I_DATA','ROBINSON') index_name FROM DUAL; ---删除了一些无用信息

INDEX_NAME
--------------------------------------------------------------------------------

 CREATE INDEX "ROBINSON"."I_DATA" ON "ROBINSON"."TEST" ("DATA") LOCAL
 (PARTITION "P1"  TABLESPACE "P1" ,PARTITION "P2"  TABLESPACE "P2" , PARTITION "P3" TABLESPACE "P3" )

user_part_indexes视图也可以证明刚才创建的索引,一个是有前缀的,一个是无前缀的

SQL> select index_name,table_name,partitioning_type,locality,ALIGNMENT from user_part_indexes;

INDEX_NAME                     TABLE_NAME                     PARTITIONING_TYPE LOCALITY ALIGNMENT
------------------------------ ------------------------------ ----------------- -------- ------------
I_DATA                         TEST                           RANGE             LOCAL    NON_PREFIXED
I_ID                           TEST                           RANGE             LOCAL    PREFIXED

二、全局索引特点:

1.        全局索引的分区键和分区数和表的分区键和分区数可能都不相同,表和全局索引的分区机制不一样。

2.        全局索引可以分区,也可以是不分区索引,全局索引必须是前缀索引,即全局索引的索引列必须是以索引分区键作为其前几列。

3.        全局分区索引的索引条目可能指向若干个分区,因此,对于全局分区索引,即使只截断一个分区中的数据,都需要rebulid若干个分区甚至是整个索引。

4.        全局索引多应用于oltp系统中。

5.        全局分区索引只按范围或者散列hash分区,hash分区是10g以后才支持。

6.        oracle9i以后对分区表做move或者truncate的时可以用update global indexes语句来同步更新全局分区索引,用消耗一定资源来换取高度的可用性。

7.        表用a列作分区,索引用b做局部分区索引,若where条件中用b来查询,那么oracle会扫描所有的表和索引的分区,成本会比分区更高,此时可以考虑用b做全局分区索引。

全局索引:与本地分区索引不同的是,全局分区索引的分区机制与表的分区机制不一样。全局分区索引全局分区索引只能是B树索引,到目前为止(10gR2)oracle只支持有前缀的全局索引。另外oracle不会自动的维护全局分区索引,当我们在对表的分区做修改之后,如果执行修改的语句不加上update global indexes的话,那么索引将不可用。以上面创建的分区表test为例,讲解全局分区索引:

SQL> drop index i_id ;

Index dropped

SQL> create index i_id_global on test(id) global
  2  partition by range(id)
  3  ( partition p1 values less than (2000) tablespace p1,
  4    partition p2 values less than (maxvalue) tablespace p2
  5  );

Index created

SQL> alter table test drop partition p3;

Table altered

ORACLE默认不会自动维护全局分区索引,注意看status列,

SQL> select INDEX_NAME,PARTITION_NAME,STATUS from user_ind_partitions where index_name='I_ID_GLOBAL';

INDEX_NAME                     PARTITION_NAME                 STATUS
------------------------------ ------------------------------ --------
I_ID_GLOBAL                    P1                             USABLE
I_ID_GLOBAL                    P2                             USABLE

SQL> create index i_id_global on test(data) global
  2  partition by range(id)
  3  ( partition p1 values less than (2000) tablespace p1,
  4    partition p2 values less than (maxvalue) tablespace p2
  5  );

create index i_id_global on test(data) global
partition by range(id)
( partition p1 values less than (2000) tablespace p1,
  partition p2 values less than (maxvalue) tablespace p2
)

ORA-14038: GLOBAL  分区索引必须加上前缀

SQL> create bitmap index i_id_global on test(id) global
  2  partition by range(id)
  3  ( partition p1 values less than (2000) tablespace p1,
  4    partition p2 values less than (maxvalue) tablespace p2
  5  );

create bitmap index i_id_global on test(id) global
partition by range(id)
( partition p1 values less than (2000) tablespace p1,
  partition p2 values less than (maxvalue) tablespace p2
)

ORA-25113: GLOBAL 可能无法与位图索引一起使用


<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

三、分区索引不能够将其作为整体重建,必须对每个分区重建

SQL> alter index i_id_global rebuild online nologging;

alter index i_id_global rebuild online nologging

ORA-14086: 不能将分区索引作为整体重建

这个时候可以查询dba_ind_partitions,或者user_ind_partitions,找到partition_name,然后对每个分区重建

SQL> select index_name,partition_name from user_ind_partitions where index_name='I_ID_GLOBAL';

INDEX_NAME                     PARTITION_NAME
------------------------------ ------------------------------
I_ID_GLOBAL                    P1
I_ID_GLOBAL                    P2

SQL> alter index i_id_global rebuild partition p1 online nologging;

Index altered

SQL> alter index i_id_global rebuild partition p2 online nologging;

Index altered

四、关于分区索引的几个视图
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

dba_ind_partitions 描述了每个分区索引的分区情况,以及统计信息
dba_part_indexes  
分区索引的概要统计信息,可以得知每个表上有哪些分区索引,分区索引的类型(local/global)
dba_indexes minus dba_part_indexes
minus操作)可以得到每个表上有哪些非分区索引

分享到:
评论

相关推荐

    分区索引,本地索引,全局索引的区别

    #### 一、Oracle分区索引概念及分类 在Oracle数据库中,分区索引是针对分区表的一种特殊索引类型,它可以显著提高对于大规模数据集的查询性能。根据索引是否与表的分区策略相匹配,分区索引可以分为两大类:本地...

    oracle分区表分区索引.docx

    分区索引可以分为两类:全局索引(Global Index)和本地索引(Local Index)。 1. 全局索引(Global Index) 全局索引是指可以跨越多个分区的索引。全局索引可以建在分区表上,也可以建在非分区表上。全局索引必须...

    oracle索引与分区索引介绍

    Oracle 索引与分区索引是 Oracle 数据库中两个重要的概念,它们都是为了提高查询性能和数据存储效率而设计的。在本文中,我们将详细介绍 Oracle 索引与分区索引的概念、特点、分类、创建方法、维护操作等方面的知识...

    Oracle分区表及分区索引

    分区索引是指在分区表上创建的索引,分区索引可以提高查询性能,例如,全局索引和分区索引。 全局索引(Global Index) 全局索引是指在分区表上创建的索引,索引包含所有的分区数据,例如: CREATE INDEX idx_...

    ORACLE分区与索引

    针对分区表,Oracle 提供了分区索引,它允许索引与分区策略相结合。例如,可以创建局部索引,每个分区都有自己的索引,或者创建全局索引,覆盖所有分区。局部索引通常在查询性能上有优势,而全局索引则适用于跨分区...

    oracle分区与索引

    - **全局索引分区**:与分区表关联的索引,支持跨分区的查询。 - **局部索引分区**:仅索引特定分区的数据。 ##### 2. 索引的优缺点 - **优点**: - 加快查询速度。 - 提高数据完整性。 - **缺点**: - 占用...

    深入oracle分区索引的详解

    表可以按range、hash、list分区,表分区后,其上的索引和普通表上的索引有所不同,oracle对于分区表上的索引分为2类,即局部索引和全局索引,下面分别对这2种索引的特点和局限性做个总结。局部索引local index1.局部...

    Oracle 分区索引介绍和实例演示

    总的来说,Oracle分区索引是大数据环境下提升数据库性能的关键技术。理解其工作原理和应用场景,能够帮助数据库管理员有效地设计和管理数据库,优化查询效率,同时保证系统的稳定性和可扩展性。

    深入学习分区表及分区索引(详解oracle分区.docx

    总结来说,Oracle分区是一种强大的数据库管理工具,特别适合处理大数据量和历史数据存储的情况。通过合理选择分区策略,可以极大地提升数据处理的速度和系统的整体性能。然而,设计和实施分区策略需要深思熟虑,以...

    Using_Database_Partitioning_with_Oracle_E-Business_Suite

    - **本地分区索引**:每个表分区都有自己的独立索引,这样可以减少索引维护的时间。 - 前缀索引与非前缀索引的区别与全局索引类似。 - **全局非分区索引**:为整个表创建索引,不考虑表的分区情况。 - **性能考量**...

    oracle分区索引的失效和重建代码示例

    以下是关于Oracle分区索引失效和重建的一些关键知识点: 1. **分区表的创建**: 在示例中,创建了一个名为`T_PART`的分区表,根据`OBJECT_ID`字段的值范围进行分区。`PARTITION BY RANGE`语句定义了不同分区的边界...

    Oracle-index-table.rar_Table

    分区表和分区索引是Oracle数据库中的重要特性,它们对于大型数据仓库的管理和性能优化至关重要。本压缩包“Oracle-index-table.rar_Table”包含了一个名为“Oracle index table.pdf”的PDF文档,专门探讨了这两项...

    全面学习分区表及分区索引

    分区索引可以是全局索引或本地索引,全局索引可以独立于分区表,而本地索引的分区形式与表的分区相同。 分区方式 Oracle数据库中提供了多种分区方式,包括Range分区、Hash分区、List分区和组合分区等。 * Range...

    09 oracle的索引 PPT

    4. 快速全局索引扫描(Full-Index Scan):当索引条目少于表的行数时,全索引扫描可能比全表扫描更快。 六、索引的限制 1. 空值处理:Oracle中的空值在索引中处理特殊,可能影响索引的使用。 2. 数据分布:索引性能...

Global site tag (gtag.js) - Google Analytics