返回顶部
首页 > 资讯 > 数据库 >如何解析分区索引中local index索引和global index
  • 291
分享到

如何解析分区索引中local index索引和global index

2024-04-02 19:04:59 291人浏览 安东尼
摘要

本篇文章给大家分享的是有关如何解析分区索引中local index索引和global index,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

本篇文章给大家分享的是有关如何解析分区索引中local index索引和global index,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。


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

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

一、本地索引特点:
分区索引就是在所有每个区上单独创建索引,它能自动维护,在drop或truncate某个分区时不影响该索引的其他分区索引的使用,也就是索引不会失效,维护起来比较方便,但是在查询性能稍微有点影响。

      create index idx_ta_c2 on ta(c2) local (partition p1,partition p2,partition p3,partition p4); 或者 create index idx_ta_c2 on ta(c2) local ;

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

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

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

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

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

6. 本地分区索引是对单个分区的,每个分区索引只指向一个表分区,全局索引则不然,一个分区索引能指向n个表分区,同时,一个表分区,也可能指向n个索引分区,对分区表中的某个分区做truncate或者move,shrink等,可能会影响到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 LOCALNON_PREFIXED
I_ID TEST RANGE LOCALPREFIXED

 

二、全局索引特点:
全局索引就是在全表上创建索引,它可以创建自己的分区,可以和分区表的分区不一样,也就是它是独立的索引。在drop或truncate某个分区时需要创建索引alter index idx_xx rebuild,也可以alter table table_name drop partition partition_name update global indexes;实现,但是要花很长时间在重建索引上。可以通过查询user_indexes、user_part_indexes和 user_ind_partitions视图来查看索引是否有效

create index idx_ta_c3 on ta(c3);

或者把全局索引分成多个区(注意和分区表的分区不一样):

create index idx_ta_c4 on ta(c4) global partition by range(c4)(partition ip1 values less than(10000),partition ip2 values less than(20000),partition ip3 values less than(maxvalue));

  注意索引上的引导列要和range后列一致,否则会有ORA-14038错误。

  oracle会对主键自动创建全局索引

  如果想在主键的列上创建分区索引,除非主键包括分区键,还有就是主键建在两个或以上列上。

  在频繁删除表的分区且数据更新比较频繁时为了维护方便避免使用全局索引。

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 可能无法与位图索引一起使用


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

 

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

四、关于分区索引的几个视图

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

五、实验
sql> create table T48_TRANSACTION_MODEL  
     (  
       trandate    DATE,  
       orgid       VARCHAR2(11),  
       stan        NUMBER,  
       subjectno   VARCHAR2(10),  
       subjectname VARCHAR2(50),  
       acctid      NUMBER  
     )  
     partition by range (TRANDATE)  
     (  
       partition XYZ_20100000 values less than (TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),  
       partition XYZ_20110101 values less than (TO_DATE(' 2011-01-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),  
       partition XYZ_20110102 values less than (TO_DATE(' 2011-01-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),  
       partition XYZ_20110103 values less than (TO_DATE(' 2011-01-04 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),  
       partition XYZ_20110104 values less than (TO_DATE(' 2011-01-05 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),  
       partition XYZ_20110105 values less than (TO_DATE(' 2011-01-06 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),  
       partition XYZ_20110106 values less than (TO_DATE(' 2011-01-07 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),  
       partition XYZ_20110107 values less than (TO_DATE(' 2011-01-08 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'))  
     );

Table created.


SQL> create index T48_TRANSACTION_MODEL_IDX1 on T48_TRANSACTION_MODEL(stan) local;     

Index created.

SQL> create index T48_TRANSACTION_MODEL_IDX2 on T48_TRANSACTION_MODEL(acctid)  ;    

Index created.

SQL> select index_owner,index_name,partition_name from dba_ind_partitions where index_name in('T48_TRANSACTION_MODEL_IDX1','T48_TRANSACTION_MODEL_IDX2');

INDEX_OWNER                    INDEX_NAME                     PARTITION_NAME
------------------------------ ------------------------------ ------------------------------
SYS                            T48_TRANSACTION_MODEL_IDX1     XYZ_20100000
SYS                            T48_TRANSACTION_MODEL_IDX1     XYZ_20110101
SYS                            T48_TRANSACTION_MODEL_IDX1     XYZ_20110102
SYS                            T48_TRANSACTION_MODEL_IDX1     XYZ_20110103
SYS                            T48_TRANSACTION_MODEL_IDX1     XYZ_20110104
SYS                            T48_TRANSACTION_MODEL_IDX1     XYZ_20110105
SYS                            T48_TRANSACTION_MODEL_IDX1     XYZ_20110106
SYS                            T48_TRANSACTION_MODEL_IDX1     XYZ_20110107

8 rows selected.

查询发现全局索引不在视图dba_ind_partitions中。

 
--查看是否是分区索引:  
 
SQL> select owner,index_name,index_type,table_owner,table_name,table_type,partitioned from dba_indexes where index_name in('T48_TRANSACTION_MODEL_IDX1','T48_TRANSACTION_MODEL_IDX2');

OWNER                          INDEX_NAME                     INDEX_TYPE                  TABLE_OWNER                    TABLE_NAME                     TABLE_TYPE  PAR
------------------------------ ------------------------------ --------------------------- ------------------------------ ------------------------------ ----------- ---
SYS                            T48_TRANSACTION_MODEL_IDX2     NORMAL                      SYS                            T48_TRANSACTION_MODEL          TABLE       NO
SYS                            T48_TRANSACTION_MODEL_IDX1     NORMAL                      SYS                            T48_TRANSACTION_MODEL          TABLE       YES

查询得索引T48_TRANSACTION_MODEL_IDX2不是分区索引,而T48_TRANSACTION_MODEL_IDX1是分区索引。

SQL> select index_name,table_name,partitioning_type,locality,ALIGNMENT from user_part_indexes where index_name in('T48_TRANSACTION_MODEL_IDX1','T48_TRANSACTION_MODEL_IDX2');

INDEX_NAME                     TABLE_NAME                     PARTITION LOCALI ALIGNMENT
------------------------------ ------------------------------ --------- ------ ------------
T48_TRANSACTION_MODEL_IDX1     T48_TRANSACTION_MODEL          RANGE     LOCAL  NON_PREFIXED

 
总结:  
全局索引:  
优点:通过索引检索,没有限定分区的谓词、或跨分区时,性能好点,  
缺点:分区维护的时候麻烦,drop分区等维护会失效,dml的时候索引维护成本高,数据大了rebuild也难  
 
local 索引:  
优点:通过索引检索,有限定分区的谓词、不跨分区时,性能好,分区维护容易,dml的索引维护底,rebuild也方便。  
缺点:通过索引检索,又没有限定分区的谓词、或跨分区时,性能不如全局索引  
 
有分区裁剪的,那么其他列就建立分区索引  
 
没有分区裁剪的,那么列就建立global 索引 

以上就是如何解析分区索引中local index索引和global index,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: 如何解析分区索引中local index索引和global index

本文链接: https://lsjlt.com/news/65784.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何解析分区索引中local index索引和global index
    本篇文章给大家分享的是有关如何解析分区索引中local index索引和global index,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。...
    99+
    2024-04-02
  • mysql如何删除index索引
    小编给大家分享一下mysql如何删除index索引,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! m...
    99+
    2024-04-02
  • 怎么进行主键local索引、unique local索引、分区索引顺序的理解
    本篇文章为大家展示了怎么进行主键local索引、unique local索引、分区索引顺序的理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 ...
    99+
    2024-04-02
  • 如何理解index merge合并索引
    本篇文章给大家分享的是有关index merge合并索引,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。mysql> create ind...
    99+
    2024-04-02
  • elasticsearch索引index之Translog数据功能分析
    目录translog的结构及写入方式translogFile的继承关系TranslogFile快照的方法总结translog的结构及写入方式 跟大多数分布式系统一样,es也通过临时写...
    99+
    2024-04-02
  • elasticsearch索引index之put mapping的设置分析
    目录mapping的设置过程put mappingupdateTask响应总结mapping的设置过程 mapping机制使得elasticsearch索引数据变的更加灵活,近乎于n...
    99+
    2024-04-02
  • elasticsearch索引的创建过程index create逻辑分析
    目录索引的创建过程materOperation方法实现clusterservice处理建立索引 修改配置总结索引的创建过程 从本篇开始,就进入了Index的核心代码部分。这里首先分析...
    99+
    2024-04-02
  • Oracle表table与索引index的分析及索引重建及统计信息导入导出
    1.分析表与索引(analyze 不会重建索引) ...
    99+
    2024-04-02
  • Oracle和PostgreSQL中Storage Index特性与BRIN索引是什么
    本篇内容介绍了“Oracle和PostgreSQL中Storage Index特性与BRIN索引是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这...
    99+
    2024-04-02
  • MySQL中单列索引和多列索引的示例分析
    这篇文章主要为大家展示了“MySQL中单列索引和多列索引的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中单列索引和多列索引的示例分析”这篇文...
    99+
    2024-04-02
  • MySQL中B树索引和B+树索引的区别详解
    目录1. 多路搜索树2. B树-多路平衡搜索树3. B树索引4. B+树索引总结如果用树作为索引的数据结构,每查找一次数据就会从磁盘中读取树的一个节点,也就是一页,而二叉树的每个节点...
    99+
    2024-04-02
  • MySQL中复合索引和覆盖索引的区别详解
    目录前言准备复合索引覆盖索引总结前言准备 我们先准备一张表和几个字段,方便介绍覆盖索引和复合索引。 创建一个user表,表中有id、name、school、age字段。 字段名字段类型idintnamevarcharsc...
    99+
    2023-11-23
    MySQL 复合索引 MySQL 覆盖索引
  • oracle分区索引失效如何解决
    当Oracle分区索引失效时,可以尝试以下几种解决方法:1. 重新构建分区索引:使用ALTER INDEX语句来重建分区索引,例如:...
    99+
    2023-08-25
    oracle
  • Oracle如何创建分区索引
    这篇文章主要介绍了Oracle如何创建分区索引,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 分区索引总结: 一,分区索引分为2类: 1、...
    99+
    2024-04-02
  • Java数组中如何删除scores数组索引index位置的值
    Java数组中如何删除scores数组索引index位置的值,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。import java.util.Scanner;publi...
    99+
    2023-06-02
  • python pandas中索引函数loc和iloc的区别分析
    目录前言1、直接使用行或者列标签2、loc函数3、iloc函数总结前言 使用pandas进行数据分析的时候,我们经常需要对DataFrame的行或者列进行索引。使用pandas进行索...
    99+
    2024-04-02
  • 如何解析MySQL索引问题
    今天就跟大家聊聊有关如何解析MySQL索引问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。0 前言这篇文章不会讲解索引的基础知识,主要是关于MyS...
    99+
    2024-04-02
  • PHP中的数组索引:如何使用路径和numy索引?
    数组是PHP中最常用的数据结构之一,可以用来存储一系列相关的数据。在PHP中,数组可以通过索引来访问其中的元素,索引可以是数字或字符串。除此之外,PHP还提供了两种特殊的数组索引方式:路径索引和numy索引。本文将介绍这两种索引方式的使用...
    99+
    2023-10-01
    path numy 索引
  • mysql如何对比索引查询分析
    这篇文章将为大家详细讲解有关mysql如何对比索引查询分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。explain select a...
    99+
    2024-04-02
  • mongodb中索引分类是怎样的以及如何创建索引
    mongodb中索引分类是怎样的以及如何创建索引,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。学习索引分类和创建索引:   &nbs...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作