首页 > 解决方案 > 分区索引以减少缓冲区繁忙等待?

问题描述

有时,我们的 Oracle 响应时间会显着缩短一两分钟,而不会产生额外的负载。我们能够识别一个插入语句,它会产生大量的缓冲区忙等待

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

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

老实说:我不确定这意味着什么。我不知道分区索引是什么。我只能 Image 这意味着创建一个带有本地索引的分区。

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

谢谢,E。

标签: oracleoptimizationdatabase-partitioning

解决方案


我不确定那是什么意思。

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

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

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

这可能会导致很多争用——比您预期的要多,因为索引与多版本读取一致性一起工作的方式我的意思是,在一些罕见的情况下(取决于事务逻辑的编写方式和并发会话的数量),它真的很严重。

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

然而,那是一把双刃剑。一方面,您获得的争用较少,因为您在整个索引中插入(好)。另一方面,您的行遍布整个索引,这意味着您无法将它们全部缓存。您刚刚将一个大的逻辑 I/O 问题变成了一个物理 I/O 问题!

现在,我们有一个更好的解决方案——索引上的 GLOBAL HASH PARTITION。

使用 GHP,您可以指定哈希桶的数量,并使用它来权衡需要处理的争用量与希望索引更新的紧凑程度(以获得更好的缓冲区缓存)。您使用的索引哈希分区越多,您的并发性就越好,但您的索引块缓冲区缓存会越差。

我发现 16 个左右的(全局散列分区)数量相当不错。


推荐阅读