我对数据库很陌生,并且一直坚持这个问题。我想我只需要指导从哪里开始解决这类问题。
我设置了一个非常频繁地接收数据的Web服务器并将其写入oracle数据库。
服务器需要能够为每个用户接收多行数据(大约30 - 100每10秒,当有积压时偶尔会丢失1000行)。
通过测试应用程序,在尝试扩展用户数时看起来存在瓶颈。我怀疑我只是采用了错误的方法来编写查询/表结构。
使用100 - 150个用户进行测试可以让我的响应时间呈线性增长(20分钟后最多800秒!)。
我的印象是每个带有数据块的请求都要排队,而oracle进程每个都要逐一写入,这是对的吗?这是因为桌子被锁定了吗?
数据全部写入一个表,每个“行”用一个查询输入。因此,如果我有30行数据,则需要运行30个插入。
尝试提高性能时尝试的最佳方法是什么?
可能是一个长镜头,但希望有人可以帮助/遇到类似的问题。
感谢。
答案 0 :(得分: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可以正确处理它而无需额外的表。
希望这有帮助