常常我们须要将大表依据分区键进行分区,当建立索引的时候。我们究竟使用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. POJ-1190 蛋糕问题

    这道题目我们使用深搜加剪枝的方法来写,我们首先算出一个最小表面积和最小体积来,就是半径从一递增,高度也从一递增,这是题目要求. 然后我们计算出一个底层最大的半径和最大的高度,我们就从这个最大半径和最大 ...

  2. git 知识(转)

    转自:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html Workspace:工作区 Index / Stage:暂存区 Repos ...

  3. Insertion or Heap Sort

    7-14 Insertion or Heap Sort(25 分) According to Wikipedia: Insertion sort iterates, consuming one inp ...

  4. scrapy_redis使用介绍

    scrapy_redis是一个基于redis的scrapy组件,通过它可以快速实现简单的分布式爬虫程序,该组件主要提供三大功能: (1)dupefilter——URL去重规则(被调度器使用) (2)s ...

  5. Flask--Config研究

    导入Flask框架后,在项目跟目录下面会有一个Config.py 文件,里面的默认内容为: class Config(object): pass 可以这Config 类里面定义变量和其他对象 如: c ...

  6. hexo干货系列:(四)将hexo博客同时托管到github和coding

    前言 之前我们把hexo托管在github,但是毕竟github是国外的,访问速度上还是有点慢,所以想也部署一套在国内的托管平台,之前查资料听说gitcafe,但是听说gitcafe已经被coding ...

  7. linux centos7 swap 设置 添加 删除

    操作  需要  root 用户 权限 dd 命令 创建swap用的分区文件 /var/swap  dd if=/dev/zero of=/var/swap bs=1024 count=2048000 ...

  8. 【shell】通过shell编写ping包及arp的监控并发送短信

    1 #!/bin/bash 2 NOW="`date +%Y%m%d-%H:%M:%S`" 3 PHONES=15134567893 4 IP=10.100.8.78 5 GATE ...

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

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

  10. [Usaco2006 Nov]Bad Hair Day 乱发节

    Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 1268  Solved: 625[Submit][Status][Discuss] Description ...