更新查询需要太多时间
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 连接所花费的时间。因此,建议一次性发送尽可能多的数据,而不是一个接一个地发送。
【讨论】:
以上是关于更新查询需要太多时间的主要内容,如果未能解决你的问题,请参考以下文章