【问题标题】:Inserting asyncronously into Oracle, any benefits?异步插入Oracle,有什么好处吗?
【发布时间】:2010-05-26 10:29:44
【问题描述】:

我正在使用 ODP.NET 将数据加载到 Oracle 中。我在每次调用时将插入批量插入到 1000 行的组中。

异步调用我的加载方法有什么性能优势吗?所以说我想插入 10000 行,而不是同步进行 10 次调用,而是异步进行 10 次调用。

我的数据库现在正在使用 ASSM,但当然也使用了大量的 freelist。数据库服务器也有几个核心。

我最初的测试似乎表明性能有所提高,但也许有一些我看不到的东西?潜在的死锁或争用问题?

当然,以这种方式处理事务会增加复杂性。

【问题讨论】:

    标签: performance oracle insert


    【解决方案1】:

    取决于瓶颈在哪里。

    如果瓶颈是 CPU,并且您有多个 CPU/内核,那么多个会话可以使用多个处理器,这应该会加快速度。

    如果瓶颈是网络(在“app”框和“db”框之间),那么优势将不那么明显。您可以获得一些好处(例如,会话 'a' 占用网络,而会话 'b' 使用磁盘/cpu,反之亦然)。

    磁盘介于两者之间。磁盘写入由 DBWR 进程和用于重做日志的 LGWR 在后台处理。同样,如果会话在不同时间使用不同的资源,您会看到一些好处。

    您可能会发生争用,尤其是在“连续”数字或日期的索引上,并行会话可能希望写入索引的同一位。

    您正在加载什么样的数据量?如果它非常大,您可能会受益于通过外部表传输文件(例如 CSV)和上传。

    【讨论】:

      【解决方案2】:

      如果您同时插入(即通过多个会话),您应该会看到性能提高(达到限制)。您尚未描述如何异步插入,但我想您打开了与数据库的多个连接。如果您有足够的空闲列表(或者您正在使用 ASSM),那么瓶颈应该是磁盘写入速度。每个会话只提交一次(在工作负载结束时),您不应该遇到争用问题。

      您已经看到了性能的提升,只有您自己才能判断它是否值得付出努力。

      【讨论】:

      • 是的,我打开了多个到数据库的连接。性能优势现在似乎有点参差不齐。我正在通过网络进行测试,所以我需要在本地进行测试以真正查看是否有任何区别。可悲的是,我有时会遇到一些 ORA 错误。真的很难排除故障,因为我一遍又一遍地加载相同的测试数据。还有一些负载抱怨数据类型不匹配。
      • @Karl Trumstedt:如果没有准确的错误消息和代码示例,很难判断会发生什么。尝试确定性能最佳的并行会话数。随着会话数量的增加,您应该观察到收益递减(如果您创建的连接过多,吞吐量最终会降低)。
      猜你喜欢
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      相关资源
      最近更新 更多