我有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
答案 0 :(得分:2)
如你所说:
我有1亿卢比数据的数据集,我正在循环它
我建议尝试使用OpenXML插入。看一下this样本。
修改强>
另见this。这里使用OpenXml
在Oracle中翻译SQL openedXml
。
此外,如果您使用DataSet
,为什么不使用DataSet.Update方法?
答案 1 :(得分:1)
查看您的查询:
“更新Table1 set field1 ='数据集中的值',其中field2 ='数据集中的值'”
我首先想知道你是如何用这些数据库值代替的...如果我不得不猜测,我敢打赌你这样做的方式很容易被sql注入。但后来我意识到这并不重要,因为你可能根本没有在这里使用数据集。我敢打赌你会逐一浏览数据集中的每一行并运行基本相同的更新查询,如果这是真的,那么我们几乎可以肯定地为你编写一个查询数据库并更新每条记录想要在一个声明中,这样你就永远不会将数据集拉回到你的计算机上。这样的查询会在你现在需要的时间内运行很短的时间......但要做到这一点,我们需要先看一点代码。
答案 2 :(得分:0)
有多种方法可以解决这种情况: -
这里的瓶颈可能是.Net代码打开Oracle连接所需的时间。因此,建议一次发送尽可能多的数据,而不是逐个发送。