本地分区索引与全局分区索引的区别:
局部索引local index
1. 局部索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区说,一句话,局部索引的分区机制和表的分区机制一样。
2. 如果局部索引的索引列以分区键开头,则称为前缀局部索引。
3. 如果局部索引的列不是以分区键开头,或者不包含分区键列,则称为非前缀索引。
4. 前缀和非前缀索引都可以支持索引分区消除,前提是查询的条件中包含索引分区键。
5. 局部索引只支持分区内的唯一性,无法支持表上的唯一性,因此如果要用局部索引去给表做唯一性约束,则约束中必须要包括分区键列。
6. 局部分区索引是对单个分区的,每个分区索引只指向一个表分区,全局索引则不然,一个分区索引能指向n个表分区,同时,一个表分区,也可能指向n个索引分区, 对分区表中的某个分区做truncate或者move,shrink等,可能会影响到n个全局索引分区,正因为这点,局部分区索引具有更高的可用性。
7. 位图索引只能为局部分区索引。
8. 局部索引多应用于数据仓库环境中。
全局索引global index
1. 全局索引的分区键和分区数和表的分区键和分区数可能都不相同,表和全局索引的分区机制不一样。
2. 全局索引可以分区,也可以是不分区索引,全局索引必须是前缀索引,即全局索引的索引列必须是以索引分区键作为其前几列。
3. 全局分区索引的索引条目可能指向若干个分区,因此,对于全局分区索引,即使只动,截断一个分区中的数据,都需要rebulid若干个分区甚 至是整个索引。
4. 全局索引多应用于oltp系统中。
5. 全局分区索引只按范围或者散列hash分区,hash分区是10g以后才支持。
6. oracle9i以后对分区表做move或者truncate的时可以用update global indexes语句来同步更新全局分区索引,用消耗一定资源来换取高度的可用性。
7. 表用a列作分区,索引用b做局部分区索引,若where条件中用b来查询,那么oracle会扫描所有的表和索引的分区,成本会比分区更高,此时可以考虑用b做全局分区索引
数据仓库中大多数分区实现使用的是局部索引,而在OLTP系统中,全局索引则更为常见。
在选择索引类型时,可以参考以下经验:
1 如果表的分区键(partitioning column)是索引键(index key)的子集,应使用本地索引。否则继续参考经验 2。
2 如果索引为唯一索引(unique),应使用全局索引。否则继续参考经验 3。
3 如果用户对可管理性的要求更高,应使用本地索引。否则继续参考经验 4。
4 如果应用系统为 OLTP,且对系统的响应时间要求较高,应使用全局索引。如果应用系统为 DSS,且对系统的数据吞吐量要求较高,应使用本地索引。
注意:用户可以在分区表上创建位图索引(bitmap index),但必须是本地分区索引(local partitioned index),而不能是全局索引(global index)。全局索引(global index)可以是唯一的。如果分区键是索引键的子集,本地索引只能是唯一的。
表已分区,每个分区的索引,应存放到与数据不同的表空间,以更好的实现性能
主键索引分区, 先对主键列建立一个分区索引,然后再对表添加主键,此时主键索引将使用主键列上建立的分区索引。
Global 索引分区只支持2种类型: range 和 hash
以下是在 OLTP 系统中使用分区索引的一些指导建议:
1 全局分区索引(global partitioned index)及唯一本地分区索引(unique local partitioned index)与非唯一本地分区索引(nonunique local partitioned index)相比能够提供更好的性能。前两者能够最小化需要被检索的索引分区。
2 在对表的分区或子分区进行维护时,本地分区索引具备更高的可用性。
3 全局哈希分区索引(global hash-partitioned index)在索引值单调增长的情况下能够 均匀分布索引数据,从而提升系统性能。索引值单调增长指新索引数据只会插入到索引的右边界外。
以下是在数据仓库系统及 DSS 系统中使用分区索引的一些指导建议:
1 应尽可能地使用本地分区索引(local partitioned index),因为此类索引在数据加载过程中及进行分区维护操作时更易管理(data load)
2 本地分区索引有助于提升系统性能,因为对一个范围内的索引键进行查询时,可以并行地扫描多个分区。
以下是关于在复合分区(composite partition)上创建分区索引(partitioned index)的一些建议:
1 子分区索引(subpartitioned index)必须是本地的,且默认与表的子分区存储在一起。
2 用户既可以为整个索引设定表空间,也可以分别为索引子分区设定表空间。
查询当前用户下有哪些分区索引:
SELECT * FROM USER_PART_INDEXES;
查询当前用户下分区索引的分区信息:
SELECT * FROM USER_IND_PARTITIONS T
WHERE T.INDEX_NAME=?
查询索引、表上在那些列上创建了分区:
SELECT * FROM USER_PART_KEY_COLUMNS;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29337971/viewspace-1066220/
,如需转载,请注明出处,否则将追究法律责任。