Use Local Or Global Index?
2014-10-13 16:24
204 查看
经常我们需要将大表根据分区键进行分区,当建立索引的时候,我们到底使用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索引,因为在删除分区的时候不需要重建索引。但是有时候本地索引将会带来很大的性能影响:
LC_NON_PREFIXED_TYP_I执行了1942次,这种情况如果我们加上适当的条件,尽量减少分区的扫描:
[align=left]这次LC_NON_PREFIXED_TYP_I只执行了一次[/align]
[align=left]
[/align]
[align=left]那我们换成global index呢?[/align]
[align=left]索引只执行了一次,consistent gets为1496 是用local的一半。[/align]
[align=left]索引建立global或local index 我们需要根据分区数量、分区稳定性、sql语句综合考虑。[/align]
先看看两种索引的特点:
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)
[align=left]这次LC_NON_PREFIXED_TYP_I只执行了一次[/align]
[align=left]
[/align]
[align=left]那我们换成global index呢?[/align]
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
[align=left]索引只执行了一次,consistent gets为1496 是用local的一半。[/align]
[align=left]索引建立global或local index 我们需要根据分区数量、分区稳定性、sql语句综合考虑。[/align]
相关文章推荐
- Use Local Or Global Index?
- global index & local index的区别
- oracle 中 global index & local index的区别
- ORA-14452: attempt to create, alter or drop an index on temporary table already in use
- kibana提示“Your Kibana index is out of date, reset it or use the X-Pack upgrade assistant.”
- local|global index
- oracle11.2中分区功能测试之add&split partition对global&local index的影响
- DML with or without Index on SQLite(use Random())
- [!] Invalid `Podfile` file: undefined local variable or method `use_frameworks' for #<Pod::Podfile:0
- sudo apt-get update E: Some index files failed to download. They have been ignored, or old ones use
- 索引分区分为:本地(局部)索引(local index) 全局索引(global index)
- What is Local Index and Global Index in Partition Table? What is Prefix Index and Nonprefix Index in table?
- global index & local index的区别
- ORA-14452: attempt to create, alter or drop an index on temporary table already in use
- 分区表的global index 和 local index 跨分区查询时的性能比较
- local minimum or global minimum
- How to set an IIS Application or AppPool to use ASP.NET 3.5 rather than 2.0
- weka:Not enough memory. Please load a smaller dataset or use larger heap size.
- 织梦文章列表序号自增长标签[field:global.autoindex/]
- 错误: Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android T