我有一个Vb.net应用程序,它非常频繁地更新SQL Server数据库中的表。该表有143列,大约10,000行。更新几个不同模块的表需要相同的过程,因此更新的数据始终不同,有时它可能只是几行中的几个单元,其他时间可能是几百行和几列。
有时需要15到30秒才能更新信息。这个接缝真的很长,因为这个表可以在一秒钟或2秒内完全重写一次批量导入(我意识到这不是重点)。数据库设置为简单恢复,表只有一个索引。我尝试过更新批量大小,没有明显改善。
我正在使用以下代码进行更新。我能做些什么来提高速度吗?
Dim oMainQueryR As String
If DBSelectionsDS.HasChanges Then
Try
oMainQueryR = "SELECT * FROM DBSelections"
Using connection As New SqlConnection(RacingConStr)
Using oDataSQL As New SqlDataAdapter(oMainQueryR, connection)
oDataSQL.UpdateBatchSize = 100
Using cbT As SqlCommandBuilder = New SqlCommandBuilder(oDataSQL)
connection.Open()
oDataSQL.Update(DBSelectionsDS, "DBSelectionsDetails")
connection.Close()
End Using
End Using
End Using
DBSelectionsDS.Tables("DBSelectionsDetails").AcceptChanges()
Catch ex As Exception
ErrMess = "ERROR - occured " & ex.ToString
Call WriteError()
Call ViewError()
End Try
End If
答案 0 :(得分:3)
我愿意打赌瓶颈在两个地方:
首先,您每次需要运行更新时从表中选择所有。随着桌子的大小增加,这将花费更长时间。 SqlCommandBuilder
只需要使用架构,因此请将查询字符串更改为:
oMainQueryR = "SELECT * FROM DBSelections WHERE 0 = 1"
这将仅返回表的架构和列名,但不返回任何行,DataSet
包含CommandBuilder
执行更新所需的所有数据信息。如果你很好奇为什么会这样,那么考虑0永远不会等于1,所以SQL说永远不会任何0 = 1的行,而只是返回架构。
其次,UpdateBatchSize
限制了更新的批量大小。
考虑在DataSet
中有200行已更改的数据。您
然后将不得不两次前往数据库完成更新。
设置UpdateBatchSize = 0
将删除此限制,您也可以
只需删除该行,默认为0。
否则您的瓶颈可能是由另一个锁定DBSelections
表的事务引起的。确保如果在更新发生时对该表运行任何查询,您将要么使用with (nolock)
语句,要么确保您的更新是当时发生的唯一事务。