分区索引以减少缓冲区繁忙等待?

时间:2018-09-18 14:59:01

标签: oracle optimization database-partitioning

我们的Oracle响应时间有时会明显减少一两分钟,而不会产生额外的负载。 我们能够识别出一条插入语句,该语句会产生很多缓冲区繁忙等待

从ADDM报告中,我们得到以下提示:

Consider partitioning the INDEX "IDX1" with object
ID 4711 in a manner that will evenly distribute concurrent DML across
multiple partitions.

说实话:我不确定这是什么意思。我不知道什么是分区索引。我只能想象这意味着要创建一个具有本地索引的分区。

您能帮我吗? 对该表的读写频率很高。不使用更新或删除。

谢谢, E。

1 个答案:

答案 0 :(得分:2)

  
    

我不确定这是什么意思。

  

Oracle告诉您在索引的一小部分上有很多并发(“同时”)活动。这种情况经常发生。

请考虑表TAB1_PK上的索引列TAB1,其值是从序列TAB1_S中插入的。假设您有5个数据库会话都同时插入到TAB1中。

因为TAB1_PK已被索引,并且由于该序列按数字顺序生成值,所以发生的是所有这些会话必须同时读取和更新索引的相同块。

由于索引与多版本读取一致性的工作方式,这可能会引起很多争用-超出您的预期。我的意思是,在某些罕见的情况下(取决于事务逻辑的编写方式和并发会话的数量),它确实可能会瘫痪。

(真的)避免此问题的旧方法是使用反向键索引。这样,顺序列的值并不会全部进入相同的索引块。

但是,那是一把两刃剑。一方面,由于要在整个索引中插入(良好),因此争用较少。另一方面,您的行遍及整个索引,这意味着您无法全部缓存它们。您刚刚将一个大的逻辑I / O问题变成了一个物理I / O问题!

如今,我们有了更好的解决方案-索引上的GLOBAL HASH PARTITION。

使用GHP,您可以指定哈希存储桶的数量,并使用它在需要处理的争用与希望索引更新的紧凑程度之间进行权衡(以实现更好的缓冲区缓存)。使用的索引哈希分区越多,并发性越好,但是索引块缓冲区的缓存就越差。

我发现16个左右的数量(全局哈希分区)非常好。