在SQL Server中更新表的最快方法
我有一个Vb.net应用程序,它非常频繁地更新SQL Server数据库中的表。该表有143列,约10000行。更新多个不同模块的表需要相同的过程,因此更新的数据始终不同,有时可能只是几行中的几个单元格,有时可能是几百行和几列 有时更新信息需要15到30秒。考虑到表可以在一两秒钟内通过批量导入完全重写,这一点非常长(我意识到这与问题无关)。数据库设置为简单恢复,表只有一个索引。我尝试过使用更新批量大小,但没有明显的改进 我正在使用下面的代码进行更新。我能做些什么来提高速度吗在SQL Server中更新表的最快方法,sql,sql-server,vb.net,Sql,Sql Server,Vb.net,我有一个Vb.net应用程序,它非常频繁地更新SQL Server数据库中的表。该表有143列,约10000行。更新多个不同模块的表需要相同的过程,因此更新的数据始终不同,有时可能只是几行中的几个单元格,有时可能是几百行和几列 有时更新信息需要15到30秒。考虑到表可以在一两秒钟内通过批量导入完全重写,这一点非常长(我意识到这与问题无关)。数据库设置为简单恢复,表只有一个索引。我尝试过使用更新批量大小,但没有明显的改进 我正在使用下面的代码进行更新。我能做些什么来提高速度吗 Dim oMain
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
我敢打赌,瓶颈在于两个方面: 首先,每次需要运行更新时,都要从表中选择所有内容。随着表的增大,这将花费越来越长的时间。
SqlCommandBuilder
只需要一个模式即可使用,因此将查询字符串更改为:
oMainQueryR = "SELECT * FROM DBSelections WHERE 0 = 1"
这将只返回表的架构和列名,而不返回行。DataSet
包含CommandBuilder
执行更新所需的所有数据信息。如果你想知道为什么这样做,考虑0永远不会等于1,所以SQL说从来没有任何行0=1,而只是返回模式。
其次,UpdateBatchSize
限制了更新的批量大小。
考虑在<代码>数据集< /代码>中有200行更改的数据。你
然后,您必须访问数据库两次才能完成更新。
设置UpdateBatchSize=0将删除此限制,您也可以
只需删除该行,因为默认值为0
否则,另一个事务锁定
dbs
表可能会导致瓶颈。确保在更新过程中,如果您正在对该表运行任何查询,您要么希望使用with(nolock)
语句,要么确保您的更新是当时发生的唯一事务。我愿意打赌瓶颈在于两个地方:
首先,每次需要运行更新时,都要从表中选择所有内容。随着表的增大,这将花费越来越长的时间。SqlCommandBuilder
只需要一个模式即可使用,因此将查询字符串更改为:
oMainQueryR = "SELECT * FROM DBSelections WHERE 0 = 1"
这将只返回表的架构和列名,而不返回行。DataSet
包含CommandBuilder
执行更新所需的所有数据信息。如果你想知道为什么这样做,考虑0永远不会等于1,所以SQL说从来没有任何行0=1,而只是返回模式。
其次,UpdateBatchSize
限制了更新的批量大小。
考虑在<代码>数据集< /代码>中有200行更改的数据。你
然后,您必须访问数据库两次才能完成更新。
设置UpdateBatchSize=0将删除此限制,您也可以
只需删除该行,因为默认值为0
否则,另一个事务锁定
dbs
表可能会导致瓶颈。确保在更新过程中,如果您正在对该表运行任何查询,您要么希望使用with(nolock)
语句,要么确保您的更新是当时发生的唯一事务。我愿意打赌瓶颈在于两个地方:
首先,每次需要运行更新时,都要从表中选择所有内容。随着表的增大,这将花费越来越长的时间。SqlCommandBuilder
只需要一个模式即可使用,因此将查询字符串更改为:
oMainQueryR = "SELECT * FROM DBSelections WHERE 0 = 1"
这将只返回表的架构和列名,而不返回行。DataSet
包含CommandBuilder
执行更新所需的所有数据信息。如果你想知道为什么这样做,考虑0永远不会等于1,所以SQL说从来没有任何行0=1,而只是返回模式。
其次,UpdateBatchSize
限制了更新的批量大小。
考虑在<代码>数据集< /代码>中有200行更改的数据。你
然后,您必须访问数据库两次才能完成更新。
设置UpdateBatchSize=0将删除此限制,您也可以
只需删除该行,因为默认值为0
否则,另一个事务锁定
dbs
表可能会导致瓶颈。确保在更新过程中,如果您正在对该表运行任何查询,您要么希望使用with(nolock)
语句,要么确保您的更新是当时发生的唯一事务。我愿意打赌瓶颈在于两个地方:
首先,每次需要运行更新时,都要从表中选择所有内容。随着表的增大,这将花费越来越长的时间。SqlCommandBuilder
只需要一个模式即可使用,因此将查询字符串更改为:
oMainQueryR = "SELECT * FROM DBSelections WHERE 0 = 1"
这将只返回表的架构和列名,而不返回行。DataSet
包含CommandBuilder
执行更新所需的所有数据信息。如果你想知道为什么这样做,考虑0永远不会等于1,所以SQL说从来没有任何行0=1,而只是返回模式。
其次,UpdateBatchSize
限制了更新的批量大小。
考虑20