0

我有包含 1000 万个数据的数据集,我正在遍历它并使用数据集的值来更新计数为 2500 万的基表。

where 子句中使用的字段是主键。

但我仍然没有获得性能,只有 100k 记录在 1 小时内更新。

如何优化和加快在 oracle 中执行查询的时间。

我在 vb.net 中使用命令对象、连接对象

以下函数执行了 1000 万次更新查询。

public cmd_obj as new oledb.oledbcommand
Strquery="update Table1 set field1='Value from dataset' where field2='value from dataset'" ' where field2 is primary key in base table
Public Function Executenonquery(ByVal Strquery As String) As Int32
  Dim intUpdated As Int32 = 0
  Try
    If VerifyOracleLogin() = True Then ' check oracle connection
      cmd_obj.Connection = dbconn
      cmd_obj.CommandText = Strquery 'strquery has update query
      intUpdated = cmd_obj.ExecuteNonQuery()
      return intUpdated
    End If   
  Catch ex As Exception
    WriteToErrorLog("Query Execution Error : " & Strquery, ex.Message)
    Return -1
  End Try
End Function
4

3 回答 3

2

正如你所提到的:

我有包含 1 千万数据的数据集,我正在循环遍历它

我建议尝试使用 OpenXML 插入。看看这个样本。

编辑:

也看这个。这里 SQLOpenXml在 Oracle 中使用openedXml.

另外,如果您正在使用DataSet,为什么不使用DataSet.Update方法?

于 2012-11-16T11:12:00.137 回答
1

查看您的查询:

“更新表 1 设置字段 1='来自数据集的值'其中字段 2='来自数据集的值'”

我首先想知道你是如何替换这些数据库值的......如果我不得不猜测,我敢打赌你这样做的方式很容易受到 sql 注入的影响。但后来我意识到这并不重要,因为您很可能根本没有使用数据集的业务。我敢打赌,您将逐一检查数据集中的每一行并运行基本相同的更新查询,如果这是真的,那么我们几乎可以肯定会为您编写一个查询,该查询将输出到数据库并更新您的每条记录希望在一个语句中,这样您就永远不会将数据集拉回您的计算机。这样的查询将在您现在需要的时间的一小部分内运行......但要做到这一点,我们需要先查看更多代码。

于 2012-11-18T05:10:14.077 回答
0

有多种方法可以处理这种情况:-

  1. 创建一个存储过程并传递主键列表和要设置为数组的值。在存储过程中,循环遍历数组并使用异常处理执行更新语句。这样,即使一条记录失败,也可以执行其余的更新语句。
  2. 另一种方法是按照“NeverHopeless”的建议执行脚本(附加查询)。但是在每个更新语句之后也要使用 Log Error 语句。有用的文档:- http://www.oracle-base.com/articles/10g/dml-error-logging-10gr2.php

这里的瓶颈可能是 .Net 代码打开 Oracle 连接所花费的时间。因此,建议一次性发送尽可能多的数据,而不是一一发送。

于 2012-11-18T04:50:14.860 回答