在Oracle数据库中插入行时,是否有任何方法可以提高性能?
我需要使用VBA模块每6小时向Oracle数据库表中插入1000多行。在每次运行期间,在VBA中进行一些复杂的预测计算,结果值必须插入到数据库中 典型的输出范围包括1000多行和13列 目前我逐行插入,而且每次插入后都会运行自动提交(ADODB默认)。有没有更好的方法或流程来提高性能 根据服务器负载的不同,目前大约需要20-40分钟。任何性能改进建议在Oracle数据库中插入行时,是否有任何方法可以提高性能?,oracle,vba,adodb,Oracle,Vba,Adodb,我需要使用VBA模块每6小时向Oracle数据库表中插入1000多行。在每次运行期间,在VBA中进行一些复杂的预测计算,结果值必须插入到数据库中 典型的输出范围包括1000多行和13列 目前我逐行插入,而且每次插入后都会运行自动提交(ADODB默认)。有没有更好的方法或流程来提高性能 根据服务器负载的不同,目前大约需要20-40分钟。任何性能改进建议 不要在每次插入后进行提交(如果这符合您的要求) 考虑使用append提示是否有帮助 不知道VBA(再也不知道了),但要寻找批插入,即一次性插入多条
您可能无法接受,但删除表上的任何索引,然后在完成后重新创建会有所帮助。(节省了每次插入时更新索引的开销)我自己也有这个问题。我的问题是每次插入都要打开和关闭连接。这意味着需要15分钟来导入大约1000行 我通过保持连接打开并在再次关闭连接之前通过循环向DB发送新的execute语句来解决这个问题 这是我的VBA:
' Setup the connection to the DB
Set conn = New ADODB.Connection
strConnection = "Provider=OraOLEDB.oracle;Data Source=connectionstring;User Id=username;Password=yourpasswrod;"
' Open DB connection
conn.ConnectionString = strConnection
conn.Open
Do Until IsEmpty(ActiveCell)
conn.Execute ("insert into my_table ( user, user_info) values ('1', '" & ActiveCell.value &"')")
Loop
conn.Close
Set conn = Nothing
这将输入时间缩短到约30秒。:) 这些都是好的观点。我认为#1、#4和#3是最重要的,而#2和#5是相当高级别的优化。谢谢。。我将尝试对上述几点进行更多的研究,我想知道有多少时间是在Oracle中,有多少时间是在VBA中。使用“
DBMS\u MONITOR.SESSION\u trace\u ENABLE”
的扩展SQL跟踪可能会帮助您确定花费的时间。这对于1000行来说非常缓慢。您是否尝试过参数化插入。只做一次提交也会更快。ADO DB自动提交在每次插入后,我会查看下面Jens Schauder的评论。我认为这不是一个好的选择,因为还有其他进程使用同一个表,创建和删除索引的成本也很高,只有1000行。如果有一百万的话,这就是他们的方式。