常常我们须要将大表依据分区键进行分区,当建立索引的时候。我们究竟使用local 还是global 索引呢

先看看两种索引的特点:

本地索引特点:
1. 本地索引一定是分区索引。分区键等同于表的分区键。分区数等同于表的分区说。一句话。本地索引的分区机制和表的分区机制一样。
2. 假设本地索引的索引列以分区键开头,则称为前缀局部索引。
3. 假设本地索引的列不是以分区键开头。或者不包括分区键列,则称为非前缀索引。

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

5. 本地索引仅仅支持分区内的唯一性,无法支持表上的唯一性,因此假设要用本地索引去给表做唯一性约束,则约束中必需要包含分区键列。

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

8. 本地索引多应用于数据仓库环境中。
全局索引特点:
1.全局索引的分区键和分区数和表的分区键和分区数可能都不同样,表和全局索引的分区机制不一样。

2.全局索引能够分区,也能够是不分区索引,全局索引必须是前缀索引,即全局索引的索引列必须是以索引分区键作为其前几列。
3.全局分区索引的索引条目可能指向若干个分区,因此。对于全局分区索引,即使仅仅截断一个分区中的数据,都须要 rebulid若干个分区甚至是整个索引。

4.全局索引多应用于 oltp系统中。
5.全局分区索引仅仅按范围或者散列 hash分区。 hash分区是 10g以后才支持。
6.oracle9i以后对分区表做move 或者truncate 的时能够用update global indexes语句来同步更新全局分区索引,用消耗一定资源来换取高度的可用性。
7.表用 a列作分区。索引用 b做局部分区索引,若 where条件中用 b来查询。那么 oracle会扫描全部的表和索引的分区。成本会比分区更高,此时能够考虑用 b做全局分区索引。

通常开发者喜欢建立local索引。由于在删除分区的时候不须要重建索引。可是有时候本地索引将会带来非常大的性能影响:
-----------------------------------------------------------------------------------------------------------------------
| Id | Operation |Name | Starts | E-Rows | A-Rows |Buffers |Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------
| 0 |SELECT STATEMENT | | 1 | | 1493 | 2984 | | |
| 1 | PARTITION RANGEALL | | 1 | 1493 | 1493 | 2984 | 1 | 1493 |
| 2 | TABLE ACCESS BY LOCAL INDEX ROWID| PARTITIONED_TAB | 1493 | 1493 | 1493 | 2984 | 1 | 1493 |
|* 3 | INDEX RANGE SCAN | LC_NON_PREFIXED_TYP_I | 1492 | 1493 | 1493 | 1492 | 1 | 1493 |
----------------------------------------------------------------------------------------------------------------------- Predicate Information (identifiedby operation id):
---------------------------------------------------
3 - access(MHO_TYP_ID=0) Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2984 consistent gets
0 physical reads
0 redosize
28937 bytes sent via SQL*Netto client
372 bytes received via SQL*Netfrom client
4 SQL*Net roundtripsto/fromclient
0 sorts (memory)
0 sorts (disk)
1493 rows processed

LC_NON_PREFIXED_TYP_I运行了1942次,这样的情况假设我们加上适当的条件,尽量降低分区的扫描:
SQL>select * from partitioned_tab
wheremho_typ_id = 0
and mho_date = to_date('01122012','ddmmyyyy'); MHO_ID MHO_DATE M MHO_TYP_ID
---------- ----------------- - ----------
1 20121201 00:00:00 Z 0 -------------------------------------------------------------------------------------------------------------------------
| Id | Operation |Name | Starts | E-Rows | A-Rows | Buffers | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------------
| 0 |SELECT STATEMENT | | 1 | | 1 | 2 | | |
| 1 | PARTITION RANGE SINGLE | | 1 | 1 | 1 | 2 | 2 | 2 |
|* 2 | TABLE ACCESS BY LOCAL INDEX ROWID| PARTITIONED_TAB | 1 | 1 | 1 | 2 | 2 | 2 |
|* 3 | INDEX RANGE SCAN | LC_NON_PREFIXED_TYP_I | 1 | 1 | 1 | 1 | 2 | 2 |
------------------------------------------------------------------------------------------------------------------------- Predicate Information (identifiedby operation id):
---------------------------------------------------
2 - filter(MHO_DATE=TO_DATE(' 2012-12-01 00:00:00','syyyy-mm-dd hh24:mi:ss'))
3 - access(MHO_TYP_ID=0)

这次LC_NON_PREFIXED_TYP_I仅仅运行了一次

那我们换成global index呢?

SQL>select * from partitioned_tab where mho_typ_id = 0;

------------------------------------------------------------------------------------------------------------------
| Id | Operation |Name | Starts | E-Rows | A-Rows |Buffers | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------
| 0 |SELECT STATEMENT | | 1 | | 1493 | 1496 | | |
| 1 | TABLE ACCESS BY GLOBAL INDEX ROWID| PARTITIONED_TAB | 1 | 1493 | 1493 | 1496 | ROWID | ROWID |
|* 2 | INDEX RANGE SCAN | GL_TYP_I | 1 | 1493 | 1493 | 4 | | |
------------------------------------------------------------------------------------------------------------------ Predicate Information (identifiedby operation id):
---------------------------------------------------
2 - access(MHO_TYP_ID=0) Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
1496 consistent gets
1493 physical reads
0 redosize
28937 bytes sent via SQL*Netto client
372 bytes received via SQL*Netfrom client
4 SQL*Net roundtripsto/fromclient
0 sorts (memory)
0 sorts (disk)
1493 rows processed

索引仅仅运行了一次,consistent gets为1496 是用local的一半。

索引建立global或local index 我们须要依据分区数量、分区稳定性、sql语句综合考虑。

Use Local Or Global Index?的更多相关文章

  1. [Partition][Index]对于Partition表而言,是否Global Index 和 Local Index 可以针对同一个字段建立?

    对于Partition表而言,是否Global Index 和 Local Index 可以针对同一个字段建立? 实验证明,对单独的列而言,要么建立 Global Index, 要么建立 Local ...

  2. [Oacle][Partition]Partition操作与 Index, Global Index 的关系

    [Oacle][Partition]Partition操作与 Index, Global Index 的关系: ■ Regarding the local index and the global i ...

  3. centos shell编程5 LANMP一键安装脚本 lamp sed lnmp 变量和字符串比较不能用-eq cat > /usr/local/apache2/htdocs/index.php <<EOF重定向 shell的变量和函数命名不能有横杠 平台可以用arch命令,获取是i686还是x86_64 curl 下载 第三十九节课

    centos shell编程5  LANMP一键安装脚本 lamp  sed  lnmp  变量和字符串比较不能用-eq  cat > /usr/local/apache2/htdocs/ind ...

  4. PHP: Local 和 Global 作用域

    函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问. 函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问. 下面的例子测试了带有局部和全局作用域的变量: 在上例中,有 ...

  5. shell中的环境变量:local,global,export

     1.local一般用于局部变量声明,多在在函数内部使用.实例如下:      echo_start() { local STR="$1" echo "...... ${ ...

  6. Python 变量作用域 LEGB (上)—— Local,Global,Builtin

    Python 变量作用域的规则是 LEGB LEGB含义解释:L —— Local(function):函数内的名字空间E —— Enclosing function locals:外部嵌套函数的名字 ...

  7. 关键字local、global和内置函数【locals、globals】

    每个函数都有着自已的命名空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局部定义的变量.每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数.类.其它导入的模块.模 ...

  8. Python LEGB (Local, Enclosing, Global, Build in) 规则

    Local 一个函数定义了一个 local 作用域; PyFrameObject 中的 f_local 属性 Global 一个 module 定义了一个 global 作用域; PyFrameObj ...

  9. 如何在Oracle 12C中Drop/Truncate多个分区 (Doc ID 1482264.1)

    How to Drop/Truncate Multiple Partitions in Oracle 12C (Doc ID 1482264.1) APPLIES TO: Oracle Databas ...

随机推荐

  1. SpringCloud版本介绍和SpringBoot的兼容性

    Spring Cloud是一个由众多独立子项目组成的大型综合项目,每个子项目有不同的发行节奏,都维护着自己的发布版本号.Spring Cloud通过一个资源清单BOM(Bill of Material ...

  2. 如何禁用python警告

    有-W选项. python -W ignore foo.py 所属网站分类: python基础 > 综合&其它 作者:jiem 链接:http://www.pythonheidong.c ...

  3. ArrayList练习之存储字符串并遍历

    在myArrayList项目下 新建一个包 在这个包中新建一个类:ArrayListDemo4.java ArrayListDemo4.java import java.util.ArrayList; ...

  4. [SHELL]awk的用法举例

    从初学awk到现在小有所成,非常感谢CUers的帮助,总结了下自己曾经遇到的问题和犯的错误,供初学者借鉴,因本人非计算机专业,对专业词汇可能有表述不对的地方,还请指正和补充! 1. awk '{cod ...

  5. css position是前端的你了解多少?

    此文根据Steven Bradley的<How Well Do You Understand CSS Positioning?>所译,整个译文带有我自己的理解与思想,如果译得不好或不对之处 ...

  6. Attribute "not-null" must be declared for element type "property"解决办法

    Attribute "not-null" must be declared for element type "property"解决办法 在hiberante ...

  7. Tsinghua OJ Zuma

    Description Let's play the game Zuma! There are a sequence of beads on a track at the right beginnin ...

  8. 命令行模式直接下载jar包到本地库

    命令行下,直接使用  dependency:get -DrepoUrl=仓库地址 -Dartifact=groupId:artifactId:version[:packaging][:classifi ...

  9. 理解 mysql行锁和表锁

    在调用存储过程中,就会涉及到表锁,行锁这一概念:所谓区别:有索引的时候就是行锁,没有索引的时候就是表索. innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的. 表锁演示(无索引) Ses ...

  10. 匿名函数--lambda函数

    匿名函数 匿名函数:为了解决一些功能很简单的需求而设计的一句话函数 (python对匿名函数支持有限,只有一些简单的条件下可以用匿名函数) 匿名函数固定格式: func = lambda *args: ...