本地索引与Oracle中分区表的全局索引

时间:2018-02-05 03:44:18

标签: oracle database-partitioning

我已经分区了一张桌子,这张桌子几乎以每天7-8百万行的速度增长。分区已使用时间戳列完成,因为数据可在几周后存档或丢弃。我还在表上创建了一个索引,该索引位于主键或另一个唯一的值上。我的索引也是分区的,但索引的分区已经使用哈希函数完成,并且不包括表的分区键(这是一个时间戳)。所以我有几个问题。

该表是一个写密集型表。它目前主要是插入,每行更新一次,在创建后的几秒钟内通过索引标识进行2-3次查找,然后永远不会访问任何操作的记录。

  • 在唯一ID上定义本地索引是最优的还是更好地定义全局索引并按照我的方式对它们进行分区?如果我定义全局索引,没有表中的表分区键(时间戳,在查找中没有使用),如果分区数量很大,那么访问会更加昂贵吗?
  • 为不断增长的数据提供全局分区索引有哪些缺点?
  • 一旦我决定稍后删除分区,由于索引没有按时间戳分区,而是由唯一ID分区,操作是否会对功能索引产生直接影响?

任何其他建议都会有所帮助。

1 个答案:

答案 0 :(得分:2)

实际上我不知道有什么理由让索引分区与表分区不同(这就是你所拥有的)。

创建全局索引或本地索引,即索引分区与基础表分区相同的分区索引。

如果您有全局索引并且删除或截断分区,则全局索引将变为“不可用”"并且必须重建。您可以通过向drop / truncate语句添加子句UPDATE INDEXES来自动实现此目的。但是,这样的操作可能需要一些时间,这是全局索引的主要缺点。

通常,本地索引更好,它们更容易维护,并且通常更快,因为它们更小。但是,如果您有许多分区且主要查询不包含分区键(在您的情况下为时间戳),则本地索引可能会对性能产生负面影响。如果您让我们说100个分区,则Oracle必须扫描100个索引分区,这基本上意味着:扫描100个索引!在这种情况下,全局索引要快得多。