2012-11-16 61 views
0

我有1000万点的数据集,我通过它循环和使用的数据集的值更新数2500万的基表。更新查询需要太多的时间

其在where子句是主键所使用的字段。

但还是我没有得到表现仅100K记录在1个小时内得到更新。

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

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

Connection对象下面的函数执行千万时间更新查询。

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

你的VB代码在这里很有趣;什么是作为Strquery传入的SQL?这是性能问题可能出现的地方。 –

+1

也...你如何将参数数据替换成你的查询? ExecuteNonQuery()方法签名是**反模式**,导致可怕的** Sql Injection安全性问题!**看起来您的整个数据访问层是不安全的,您的首要任务应该是重构以允许正确的参数使用。 –

回答

2

正如你所提到的:

我有1点亿卢比的数据集,我通过它

循环,我会建议尝试插入使用OpenXML的。看看this样品。

编辑:

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

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

+0

谢谢你..我可以使用它与vb.net,因为我正在使用数据集的值来更新Oracle中的表尚未使用OpenXML呢..请帮助 – ixashish

+0

我已更新答案! – NeverHopeless

+0

你好,我想基于基表上的主键匹配进行更新,这就是为什么不使用dataset.update。 – ixashish

0

有多种方式来处理这种情况: -

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

这里的瓶颈可能采取的.NET代码打开一个Oracle连接的时间。所以,建议尽量发送尽可能多的数据,而不是一个一个发送。

1

看你的查询:

“更新表1设置字段1 =‘从数据集的价值’,其中场2 =‘从数据集值’”

我第一次想知道你是如何在代那些数据库值......如果我不得不猜测,我敢打赌你是以一种易受sql注入攻击的方式来做这件事的。但后来我意识到这并不重要,因为您可能根本没有业务处理数据集。我敢打赌,你正在逐一浏览数据集中的每一行,并且运行基本上相同的更新查询,如果这是真的,那么我们几乎可以肯定地为你写一个查询,它会发送到数据库并更新每条记录希望在一个声明中,这样你永远不会将数据集拉回到你的计算机。这样的查询只需要很短的时间就可以运行,但要做到这一点,我们首先需要看到更多的代码。