【问题标题】:Multiple writes to same table in oracle causing high latency在 oracle 中多次写入同一个表导致高延迟
【发布时间】:2015-06-03 07:39:27
【问题描述】:

我对数据库还很陌生,并且已经被这个问题困扰了一段时间。我想我只需要关于从哪里开始解决这类问题的指导。

我有一个网络服务器设置为非常频繁地接收数据并将其写入 oracle 数据库。

服务器需要能够为每个用户接收多行数据(大约每 10 秒 30 到 100 行,当有积压时偶尔会卡盘 1000 行)。

从测试应用程序来看,在尝试扩展用户数量时似乎存在瓶颈。我怀疑我只是在编写查询/表结构时采用了错误的方法。

使用 100 - 150 名用户进行测试后,我的响应时间呈线性增长(20 分钟后最长可达 800 秒!)。

我的印象是,每个带有数据块的请求都必须排队,oracle 会处理每个写入,对吗?这是因为表被锁定了吗?

数据都被写入一个表,并且每一“行”都通过一个查询输入。所以如果我有 30 行数据它需要运行 30 次插入。

在尝试提高性能时,最好的尝试是什么?

  • 拥有多个表格会有帮助吗?
  • 有没有办法一次写多行,这可能会有所帮助吗?

可能是一个长镜头,但希望有人可以提供帮助/遇到了类似的问题。

谢谢。

【问题讨论】:

  • "它需要运行 30 次插入" - 我希望您在单个事务中执行这 30 次插入(例如,通过禁用自动提交并仅提交 一次 在 30 次插入之后)
  • 你的 Oracle 版本是什么?
  • 你的网络框架是什么。
  • 感谢您的快速回复!我会考虑禁用自动提交,这不是我做过/不知道的事情。 Oracle 11g Express 是我正在使用的,是的,都是同一张表。
  • 要插入的行来自文件或如何获取要插入的数据?

标签: database oracle database-design locking


【解决方案1】:

为了提高效率/安全性,我建议您使用绑定变量(如果您还没有使用它们):

INSERT INTO MYTABLE (col1, col2) VALUES (:toto, :tata);

而不是

INSERT INTO MYTABLE (col1, col2) VALUES ('value1', 'value2');

这也适用于 SELECT:

SELECT col1 
FROM MYTABLE WHERE ID=:MYID

文档中的更多信息: http://docs.oracle.com/cd/B10501_01/appdev.920/a96584/oci05bnd.htm

其次,如果你打算一次插入多行,做批量插入会更有效:服务器和客户端之间的来回越少越好:

例如,如果你有一个数组:

FORALL i IN 1..MyArray.COUNT
    INSERT INTO col1 VALUES MyArray(i);

另外,我不认为多个表会有帮助(如果没有更多信息很难说),但一般来说,Oracle 可以正确处理它而无需额外的表。

希望对你有帮助

【讨论】:

  • 感谢您的建议,绝对有帮助。
猜你喜欢
  • 2016-12-19
  • 2021-04-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
相关资源
最近更新 更多