在Oracle数据库中插入行时,是否有任何方法可以提高性能?

在Oracle数据库中插入行时,是否有任何方法可以提高性能?,oracle,vba,adodb,Oracle,Vba,Adodb,我需要使用VBA模块每6小时向Oracle数据库表中插入1000多行。在每次运行期间,在VBA中进行一些复杂的预测计算,结果值必须插入到数据库中 典型的输出范围包括1000多行和13列 目前我逐行插入,而且每次插入后都会运行自动提交(ADODB默认)。有没有更好的方法或流程来提高性能 根据服务器负载的不同,目前大约需要20-40分钟。任何性能改进建议 不要在每次插入后进行提交(如果这符合您的要求) 考虑使用append提示是否有帮助 不知道VBA(再也不知道了),但要寻找批插入,即一次性插入多条

我需要使用VBA模块每6小时向Oracle数据库表中插入1000多行。在每次运行期间,在VBA中进行一些复杂的预测计算,结果值必须插入到数据库中

典型的输出范围包括1000多行和13列

目前我逐行插入,而且每次插入后都会运行自动提交(ADODB默认)。有没有更好的方法或流程来提高性能

根据服务器负载的不同,目前大约需要20-40分钟。任何性能改进建议

  • 不要在每次插入后进行提交(如果这符合您的要求)

  • 考虑使用append提示是否有帮助

  • 不知道VBA(再也不知道了),但要寻找批插入,即一次性插入多条语句,而不是单独插入每条语句

  • 使用prepare语句

  • 考虑在插入期间禁用约束


  • 您可能无法接受,但删除表上的任何索引,然后在完成后重新创建会有所帮助。(节省了每次插入时更新索引的开销)

    我自己也有这个问题。我的问题是每次插入都要打开和关闭连接。这意味着需要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行。如果有一百万的话,这就是他们的方式。