常常我们须要将大表依据分区键进行分区,当建立索引的时候。我们究竟使用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. Python机器学习及实践+从零开始通往Kaggle竞赛之路

    内容简介 本书面向所有对机器学习与数据挖掘的实践及竞赛感兴趣的读者,从零开始,以Python编程语言为基础,在不涉及大量数学模型与复杂编程知识的前提下,逐步带领读者熟悉并且掌握当下最流行的机器学习.数 ...

  2. list、tuple、dict内部功能释义

    一.list内部功能释义 运用频次:☆☆☆☆☆ 1. append():列表末尾插入元素 [示例] >>> L1=[11,22,33] >>> L1.append( ...

  3. javascript异步处理

    http://www.ruanyifeng.com/blog/2015/04/generator.html

  4. hihoCoder#1139 二分·二分答案

    原题地址 挺简单一道题,结果因为一时傻逼写错一个小地方,导致WA成狗了_(:з」∠)_ 代码: #include <iostream> #include <cstring> # ...

  5. 复(学)习化学时突然的一个 idea

    期中考试成功探底...但是某些化学问题还是很有信息学价值的... n 烷同分异构体计数. 这个题 fanhq666 出过,就是一个 dp. 设 f[i] 表示含有 i 个节点的无标号不同构的度数限制为 ...

  6. POJ 2288 汉密尔顿回路 DP解决

    题目大意: 有n个岛屿,令Vi为岛屿Ci的权值.一条汉密尔顿路径C1,C2,C3...Cn的值为3部分 第一部分,将路径中的岛的权值相加,第二部分将每条边上的(Ci,Cj),加上所有的Vi*Vj 第三 ...

  7. [Vijos1067]Warcraft III 守望者的烦恼(DP + 矩阵优化)

    传送门 可知 f[i] = f[i - 1] + f[i - 2] + ... + f[i - k] 直接矩阵优化就好了 #include <cstdio> #include <cs ...

  8. 深入理解计算机操作系统——第10章:UNIX IO,打开,关闭,读写文件

    系统级IO:输入输出是主存与外部设备(磁盘,终端,网络)之间拷贝数据的过程 输入:从IO设备拷贝数据到主存中 输出:从主存中拷贝数据到IO设备中 10.1 unix IO 所有的IO设备都被模型化为文 ...

  9. msp430入门编程40

    msp430中C语言的软件工程--前后台程序结构

  10. 洛谷 P4720 【模板】扩展 / 卢卡斯 模板题

    扩展卢卡斯定理 : https://www.luogu.org/problemnew/show/P4720 卢卡斯定理:https://www.luogu.org/problemnew/show/P3 ...