更新查询需要花费太多时间

时间:2012-11-16 10:46:20

标签: vb.net oracle ado.net

我有1000万个数据的数据集,我循环遍历它并使用数据集的值来更新2500万的基数表。

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

但我仍然没有获得只有1万小时内更新的100k记录。

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

我正在使用命令对象,vb.net中的Connection对象

以下函数执行了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

3 个答案:

答案 0 :(得分:2)

如你所说:

  

我有1亿卢比数据的数据集,我正在循环它

我建议尝试使用OpenXML插入。看一下this样本。

修改

另见this。这里使用OpenXml在Oracle中翻译SQL openedXml

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

答案 1 :(得分:1)

查看您的查询:

  

“更新Table1 set field1 ='数据集中的值',其中field2 ='数据集中的值'”

我首先想知道你是如何用这些数据库值代替的...如果我不得不猜测,我敢打赌你这样做的方式很容易被sql注入。但后来我意识到这并不重要,因为你可能根本没有在这里使用数据集。我敢打赌你会逐一浏览数据集中的每一行并运行基本相同的更新查询,如果这是真的,那么我们几乎可以肯定地为你编写一个查询数据库并更新每条记录想要在一个声明中,这样你就永远不会将数据集拉回到你的计算机上。这样的查询会在你现在需要的时间内运行很短的时间......但要做到这一点,我们需要先看一点代码。

答案 2 :(得分:0)

有多种方法可以解决这种情况: -

  1. 创建存储过程并传递主键列表和要设置为数组的值。在存储过程中,循环遍历数组并使用异常处理执行update语句。这样,即使一条记录失败,也可以执行其余的更新语句。
  2. 另一种方法是以“NeverHopeless”建议的方式执行脚本(附加查询)。但是在每个更新语句之后也使用Log Error语句。 有用的文件: - http://www.oracle-base.com/articles/10g/dml-error-logging-10gr2.php
  3. 这里的瓶颈可能是.Net代码打开Oracle连接所需的时间。因此,建议一次发送尽可能多的数据,而不是逐个发送。