【发布时间】:2021-08-31 21:02:07
【问题描述】:
我有一个包含 25 个字段的表格。该表包含主键字段“id”和 5 NOT NULL CHECK。我得到的插入性能约为 11000 TPS,想知道是否有任何方法可以提高性能。
一些详细的背景:
- 由于某些原因,我们不能使用批量插入,即只能使用插入值。
- 提高线程数(从 12 到 20 到 100)没有任何帮助,并且 CPU 使用率非常低。该机拥有96核、755G内存和1T SSD。
- 表格中的行很小,每行大约 0.25KB。
- Oracle 版本为 19.3.0 企业版。
我做了一些尝试,但性能没有提高:
- 定义多个freelist。试过4个freelist,20个freelist,80个freelist。
- /*+ APPEND_VALUES */ 提示会使性能更差 (1100 TPS)。
提前致谢。
【问题讨论】:
-
主键值是从序列派生的吗?如果是这样,我建议尝试scalable sequences。由于您无法批量写入,因此如果您的线程都获得序列号,它们将全部写入同一个块,从而导致争用。可扩展的序列在数字的前面添加了一些随机性以避免这种争用。
-
@JonHeller 可扩展序列主要用于 RAC。您插入的数据的来源是什么?例如,它是 CSV 文件吗?您的客户端应用程序是什么以及在哪里?
-
如何删除旧数据?每秒插入 11k 条记录会在几天后填满 1TB SSD。
-
比你的 bottleneck 可能是索引,而不是表。 Oracle 使用REVERSE Index 解决此争用。行的存储(在非聚集表中)独立于
PK的值。 -
@MarmiteBomber 嗨,你是对的。使用 REVERSE 索引可以解决问题。谢谢你。 :)
标签: oracle performance insert