具有多个索引的 100 个请求/秒导致 oracle 数据库中的服务器负载为 25

Posted

技术标签:

【中文标题】具有多个索引的 100 个请求/秒导致 oracle 数据库中的服务器负载为 25【英文标题】:100 requests/second with multiple indexes results in server load of 25 in oracle database 【发布时间】:2016-10-25 18:16:50 【问题描述】:

我有一个在 8 核机器和 16Gb RAM 上使用 oracle 数据库的应用程序。该表有 15 列和大约 5700,000 行。 5 列上有经常更新的索引。当我们加载 100 个请求/秒的负载时,即插入查询,然后在每个请求循环上进行一些读取和更新操作,CPU 负载开始呈指数增长并达到 25,之后我开始收到错误

I/O Error : Socket read time out.

但是,当我们在单个列上对索引执行相同的操作时,负载将保持在 4-5 之间。虽然在 5 列上建立索引并拥有 8 核 CPU 和 16 Gb RAM 的机器,但负载肯定不会有太大差异。

【问题讨论】:

我不确定问题是什么。添加索引会产生开销——在插入和更新数据时需要维护这些索引。频繁更新的列上的索引具有相对较大的开销。您似乎在说您的负载测试证实了这些期望。没有神奇的“使用完全相同的索引但更有效地维护它们”的标志。不知道您是否需要重新考虑您认为需要的索引、您尝试使用的硬件、应用程序设计或其他什么。 @JustinCave 感谢您的回复。如果我在数据库中插入一行,则会更新表索引。是不是意味着所有的索引都在 B-Tree 中重新排列了? 我不确定您所说的“重新排列”是什么意思。插入新行可能涉及块拆分之类的事情,这可能就是您所说的。 @JustinCave 我的问题是我是否在一列加载的索引是一致的并且很好。但是如果我在服务器上的 5 列负载索引以指数方式增加到 25 并且我开始收到 I/O 错误,则服务器配置是 8 核机器和 16 Gb RAM。索引是否会出现数据库在索引维护中大部分时间利用的那么多过载。 如果您问“是否有可能在负载测试期间我的应用程序花费大部分时间来维护索引?”这当然是可能的。这听起来像你所描述的。当然,没有实际数据,很难确认任何事情。 【参考方案1】:

如果您可以显示用于创建表和创建五个索引的 DDL,将会很有帮助。了解每个索引列代表什么、数据的分布情况、值的唯一性、列更新与插入的频率等也会很有帮助。答案的准确性在很大程度上取决于你的问题。您可以打开索引创建的一些旋钮,这可能有助于解决性能问题,但这里没有足够的信息来提供任何帮助。

【讨论】:

以上是关于具有多个索引的 100 个请求/秒导致 oracle 数据库中的服务器负载为 25的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle 中,具有多个连接的查询执行需要更多时间

oracle distinct 优化

Oracle建个索引都加不进去,和业务量有没有关系

iOS - 具有 100 多个坐标的 Snap To Road API

sql优化实战:从1353秒到135秒(删除索引+修改数据+重建索引)

oracle 表字段类型,与业务SQL不合理,导致的隐式转换