更新查询需要太多时间

Posted

技术标签:

【中文标题】更新查询需要太多时间【英文标题】:update query takes too much time 【发布时间】:2012-11-16 10:46:19 【问题描述】:

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

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

但我仍然没有获得性能,只有 1 小时内更新了 10 万条记录。

如何优化和加快在 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

【问题讨论】:

你的 VB 代码在这里没什么兴趣;作为 Strquery 传入的 SQL 是什么?这就是可能出现性能问题的地方。 还有...如何将参数数据替换到查询中?您拥有的 ExecuteNonQuery() 方法签名是一个 反模式,它会导致可怕的 Sql 注入安全问题! 看起来您的整个数据访问层不安全,而且您的顶层优先级应该是重构它以允许正确的参数使用。 【参考方案1】:

正如你所提到的:

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

我建议尝试使用 OpenXML 进行插入。看看this 示例。

编辑:

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

另外,如果您使用的是DataSet,那么为什么不使用DataSet.Update 方法呢?

【讨论】:

谢谢你.. 我可以将它与 vb.net 一起使用,因为我正在使用数据集中的值来更新 Oracle 中的表尚未使用 OpenXML.. 请帮助 您好,我想根据基表上的主键匹配进行更新,这就是为什么不使用 dataset.update。 我还建议不要在每次迭代中对记录执行更新,而是在字符串中附加 50-100 个查询并执行更新,这样连接将打开一次并更新 50-100 条记录。跨度> 【参考方案2】:

查看您的查询:

"更新 Table1 set field1='Value from dataset' where field2='value from dataset'"

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于更新查询需要太多时间的主要内容,如果未能解决你的问题,请参考以下文章

数据库索引的一点学习(待更新)

Markdown写作

Hibernate 查询太多

Firebase - for循环回调中的嵌套observeSingleEvent查询太多时间更新

从多个更新查询中返回一个“更新的记录”

使用标量函数执行查询花费了太多时间