【问题标题】:Is there any way to improve performance while inserting rows into Oracle DB?在将行插入 Oracle DB 时,有什么方法可以提高性能?
【发布时间】:2012-03-23 16:17:25
【问题描述】:

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

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

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

目前大约需要 20 - 40 分钟,具体取决于服务器负载。任何性能改进建议。

【问题讨论】:

  • 我想知道有多少时间在 Oracle 中,有多少时间在 VBA 中。带有 'DBMS_MONITOR.SESSION_TRACE_ENABLE 的扩展 SQL 跟踪可能会帮助您确定时间花费在哪里。
  • 这对于 1000 行来说非常慢。您是否尝试过参数化插入。只做一次提交也会更快。
  • ADO DB 在每次插入后自动提交,我正在研究下面 Jens Schauder 制作的 cmets。

标签: oracle vba adodb


【解决方案1】:
  1. 不要在每次插入后进行提交(如果这符合您的要求)

  2. 考虑使用附加提示是否有帮助

  3. (不再了解 VBA)但寻找批量插入,即一次性插入多个语句而不是每个插入语句单独插入的东西

  4. 使用准备语句

  5. 考虑在插入期间禁用约束

【讨论】:

  • 这些都是好点。我觉得#1、#4、#3是最重要的,#2、#5是比较高的优化。
  • 谢谢 .. 我会尝试对上述几点进行更多研究
【解决方案2】:

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

【讨论】:

  • 我认为这不是一个好的选择,因为还有其他进程使用同一个表,并且创建和删除索引对于仅 1000 行也很昂贵。如果它会像一百万,这本来就是他们的方式。
【解决方案3】:

我自己也遇到过这个问题。我的问题是我为每个插入打开和关闭连接。这意味着使用 15 分钟导入大约 1000 行。

我通过保持连接打开并在再次关闭连接之前使用循环向数据库发送新的执行语句来解决这个问题。

这是我的 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 秒。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2010-11-23
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多