oracle - 分区索引以减少缓冲区繁忙等待?
问题描述
有时,我们的 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。
解决方案
我不确定那是什么意思。
Oracle 告诉您,在您的索引的一小部分上存在大量并发(“同时”)活动。这种情况经常发生。
TAB1_PK
考虑表上的一个索引列,TAB1
其值是从一个序列中插入的TAB1_S
。假设您有 5 个数据库会话同时插入TAB1
。
因为TAB1_PK
被索引,并且因为序列是按数字顺序生成值,所以所有这些会话必须同时读取和更新索引的相同块。
这可能会导致很多争用——比您预期的要多,因为索引与多版本读取一致性一起工作的方式。我的意思是,在一些罕见的情况下(取决于事务逻辑的编写方式和并发会话的数量),它真的很严重。
避免此问题的(真正)旧方法是使用反向键索引。这样,连续的列值不会全部进入相同的索引块。
然而,那是一把双刃剑。一方面,您获得的争用较少,因为您在整个索引中插入(好)。另一方面,您的行遍布整个索引,这意味着您无法将它们全部缓存。您刚刚将一个大的逻辑 I/O 问题变成了一个物理 I/O 问题!
现在,我们有一个更好的解决方案——索引上的 GLOBAL HASH PARTITION。
使用 GHP,您可以指定哈希桶的数量,并使用它来权衡需要处理的争用量与希望索引更新的紧凑程度(以获得更好的缓冲区缓存)。您使用的索引哈希分区越多,您的并发性就越好,但您的索引块缓冲区缓存会越差。
我发现 16 个左右的(全局散列分区)数量相当不错。
推荐阅读
- php - 如何在 jQuery 函数中执行 PHP
- ffmpeg - How to add audio to specific time [ffmpeg]
- parsing - BGP MRT format parsing
- javascript - Find latest version of file name from array using JavaScript
- php - 在 Wordpress Flash 主题中在哪里编辑页脚颜色?
- python - 如何使用 Setuptools 构建包并部署到私有仓库,而不会泄露或硬编码密码
- reactjs - Ant Design How to display "3 Selected" in Tree Select rather than display all value selected
- javascript - 如何在我的列表元素上添加一个按钮,以删除 CRUD 应用程序的相应元素?
- javascript - 在 JS 中为 Web 应用程序创建循环
- .net - 为什么`String()().Concat(IEnumerable(Of IEnumerable(Of String))`会失败?