常常我们须要将大表依据分区键进行分区,当建立索引的时候。我们究竟使用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. Swift 中的Range和NSRange不同

    Swift中的Ranges和Objective-C中的NSRange有很大的不同,我发现在处理Swift中Ranges相关的问题的时候,总是要花费比我想象的更多的时间.不过,现在回过头来看看,发现Sw ...

  2. set容器几个关键函数

    set在OI中非常好用,归纳几种常见的功能qwq #include<iostream> #include<cstdio> #include<set> //set容器 ...

  3. (5) openssl speed(测试算法性能)和openssl rand(生成随机数)

    1.1 openssl speed 测试加密算法的性能 支持的算法有: openssl speed [md2] [mdc2] [md5] [hmac] [sha1] [rmd160] [idea-cb ...

  4. CentOS6.8下安装Docker

    原文章链接https://www.cnblogs.com/baolong/p/5743420.html. 由于在自己安装的虚拟机上打开linux终端命令行输入uname -a 以及cat /etc/r ...

  5. POJ 3310 Caterpillar(图的度的判定)

    题意: 给定一幅图, 问符不符合一下两个条件: (1) 图中没有环 (2)图中存在一条链, 点要么在链上, 要么是链上点的邻居. 分析: 建图,记录度数, 去掉所有度为1的点, 然后看看剩下是否是有2 ...

  6. springMVC中处理静态资源的几种方案

    处理静态资源方案一:在web.xml文件中配置如下: <!-- <!–解决静态资源方案–> <servlet-mapping> <servlet-name>d ...

  7. python基础——7(函数)

    一.函数的定义(函数一定是先定义,后引用) 函数是完成特定功能的代码块. def:声明函数的关键字 fun:函数变量名 ():参数列表,参数可以是0-n个,但是()不能丢 函数体:实现功能的具体代码 ...

  8. PHPTaint-检测xss/sqli/shell注入的php扩展模块[转]

    web渗透者习惯采用黑盒或灰盒的方面来检测一款web应用是否存在漏洞,这种检测方法可以屏蔽不少漏洞,特别是程序逻辑中的漏洞.但如果能配合白盒的源码审计(也可以叫漏洞挖掘),效果将会更好,当然人力成本也 ...

  9. [Tyvj1939] 玉蟾宫(单调栈)

    传送门 题目 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写 ...

  10. 洛谷P4219 - [BJOI2014]大融合

    Portal Description 初始有\(n(n\leq10^5)\)个孤立的点,进行\(Q(Q\leq10^5)\)次操作: 连接边\((u,v)\),保证\(u,v\)不连通. 询问有多少条 ...