Oracle 分区索引原理
Oracle 的分区索引是指将一个索引分成多个片段,以便访问更小的片段,并将片段分别放在不同的磁盘驱动器上。这种方法可以提高性能和可维护性。分区索引可以应用于 B 树索引和位图索引,但不能应用于哈希索引。
分区索引有三种方式:
1. 表被分区而索引未被分区
2. 表未分区而索引被分区
3. 表和索引都被分区
无论哪种方式,都必须使用基于成本的优化器。
在 Oracle 中,索引可以提高性能的程度取决于两个因素:
1. 数据的选择性
2. 表数据在数据块上的分布
如果选择性很高(例如身份证号码),那么根据索引值返回的 ROWID 很少,索引的性能将会提高。反之,如果选择性很低(例如国家),那么返回的 ROWID 很多,索引的性能将会降低。
此外,如果选择性很高,但是相关的行在表中的存储位置并不互相靠近,那么索引的性能将会进一步降低。如果匹配索引值的数据分散在表的多个数据块中,那么必须从表中选择多个单独的块以满足查询。
Oracle 提供了两种选择来访问表中的数据:
1. 从表中读取每一行(全表扫描)
2. 通过 ROWID 一次读取一行
如果我们要访问大型表的少数行时,可能需要使用索引。因为如果没有索引,那么只能进行全表扫描。
此外,全表扫描和索引查找之间的平衡点还取决于以下几个因素:
1. 分区
2. 并行 DML
3. 并行查询
4. 使用 db_file_multiblock_read_count 进行更大的 IO 操作
5. 硬件更为快速
6. 磁盘上的缓存可以缓存更多的数据
7. 内存的廉价使得我们的内存进一步增大
8. Oracle 采用了增强的索引特性(例如跳跃式扫描索引)
在实际应用中,我们需要分析具体的情况,判断索引和 DML 语句之间的关系。增加索引会带来 insert 语句性能的下降,如果根据未索引列 update 索引列,那么也会带来性能的降低。大量的 delete 也会因为索引的存在而导致性能降低。
组合索引是指某个索引包含有多个列。在使用组合索引的时候,要谨慎选择索引列中的列顺序。一般来说,索引的第一列应该是最有可能在 where 子句中使用的列,并且也是在索引中最具有选择性的列。
在 Oracle9i 之前,查询只能在 where 子句中使用索引的第一列时使用索引。除非在 where 子句中给 empno 指定一个值,否则一般不会使用组合索引。从 Oracle9i 开始,引入了跳跃式索引扫描功能,即使在 where 子句中没有指定 empno 的数值,也会可能会使用索引。